Merge branch 'streamfield-chooser-wip' into feature/streamfield

This commit is contained in:
Matt Westcott 2015-02-11 10:34:35 +00:00
commit 887954ec31
2 changed files with 45 additions and 7 deletions

View file

@ -330,7 +330,7 @@ class FieldBlock(Block):
})
def value_from_datadict(self, data, files, prefix):
return self.field.widget.value_from_datadict(data, files, prefix)
return self.to_python(self.field.widget.value_from_datadict(data, files, prefix))
def clean(self, value):
return self.field.clean(value)
@ -349,12 +349,42 @@ class RichTextBlock(FieldBlock):
def render_basic(self, value):
return mark_safe('<div class="rich-text">' + expand_db_html(value) + '</div>')
class PageChooserBlock(FieldBlock):
class ChooserBlock(FieldBlock):
"""Abstract superclass for fields that implement a chooser interface (page, image, snippet etc)"""
@cached_property
def field(self):
return ModelChoiceField(queryset=self.target_model.objects.all(), widget=self.widget)
def to_python(self, value):
if value is None or isinstance(value, self.target_model):
return value
else:
try:
return self.target_model.objects.get(pk=value)
except self.target_model.DoesNotExist:
return None
def get_prep_value(self, value):
if isinstance(value, self.target_model):
return value.id
else:
return value
class PageChooserBlock(ChooserBlock):
@cached_property
def target_model(self):
from wagtail.wagtailcore.models import Page # TODO: allow limiting to specific page types
return Page
@cached_property
def widget(self):
from wagtail.wagtailadmin.widgets import AdminPageChooser
return ModelChoiceField(queryset=Page.objects.all(), widget=AdminPageChooser)
return AdminPageChooser
def render_basic(self, value):
if value:
return format_html('<a href="{0}">{1}</a>', value.url, value.title)
# =======
# Chooser

View file

@ -82,10 +82,14 @@ class AdminPageChooser(AdminChooser):
self.target_content_type = content_type or ContentType.objects.get_for_model(Page)
def render_html(self, name, value, attrs):
original_field_html = super(AdminPageChooser, self).render_html(name, value, attrs)
model_class = self.target_content_type.model_class()
instance = self.get_instance(model_class, value)
if isinstance(value, model_class):
instance = value
value = value.pk
else:
instance = self.get_instance(model_class, value)
original_field_html = super(AdminPageChooser, self).render_html(name, value, attrs)
return render_to_string("wagtailadmin/widgets/page_chooser.html", {
'widget': self,
@ -96,7 +100,11 @@ class AdminPageChooser(AdminChooser):
})
def render_js_init(self, id_, name, value):
page = Page.objects.get(pk=value) if value else None
model_class = self.target_content_type.model_class()
if isinstance(value, model_class):
page = value
else:
page = self.get_instance(model_class, value)
parent = page.get_parent() if page else None
content_type = self.target_content_type