try to implement to_python and get_prep_value; run into awkward discrepancies between renderable and JSON-ish values

This commit is contained in:
Matt Westcott 2015-01-14 20:55:25 +00:00
parent e1cf9f9196
commit 3694756e4e
2 changed files with 18 additions and 3 deletions

View file

@ -62,7 +62,7 @@ class StreamWidget(widgets.Widget):
self.block_def = block_def
def render(self, name, value, attrs=None):
bound_block = self.block_def.bind(json.loads(value), prefix=name)
bound_block = self.block_def.bind(value, prefix=name)
js_initializer = self.block_def.js_initializer()
if js_initializer:
js_snippet = """
@ -82,4 +82,4 @@ class StreamWidget(widgets.Widget):
return self.block_def.all_media()
def value_from_datadict(self, data, files, name):
return json.dumps(self.block_def.value_from_datadict(data, files, name))
return self.block_def.value_from_datadict(data, files, name)

View file

@ -4,9 +4,11 @@ import json
from django.db import models
from django.forms import Textarea
from django.utils.six import with_metaclass
from wagtail.wagtailcore.rich_text import DbWhitelister, expand_db_html
from wagtail.utils.widgets import WidgetWithScript
from wagtail.wagtailadmin.blocks import StreamBlock # FIXME: wagtailcore shouldn't be depending on wagtailadmin
class RichTextArea(WidgetWithScript, Textarea):
@ -38,12 +40,25 @@ class RichTextField(models.TextField):
return super(RichTextField, self).formfield(**defaults)
class StreamField(models.TextField):
class StreamField(with_metaclass(models.SubfieldBase, models.TextField)):
def __init__(self, block_types, **kwargs):
self.block_types = block_types
self.stream_block = StreamBlock(block_types)
super(StreamField, self).__init__(**kwargs)
def deconstruct(self):
name, path, args, kwargs = super(StreamField, self).deconstruct()
kwargs['block_types'] = self.block_types
return name, path, args, kwargs
def to_python(self, value):
if value is None:
return []
elif isinstance(value, list):
return value
else: # assume string
return self.stream_block.renderable(json.loads(value))
def get_prep_value(self, value):
return json.dumps(value)