From d11205454beae6bf436d09e01d544656d3bbb533 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Wed, 11 Feb 2015 01:21:24 +0000 Subject: [PATCH] fix PageChooserBlock to return a page object rather than an ID. AdminPageChooser has been tweaked to accept either an ID or an instance as its input value, and FieldBlock now passes the result of value_from_datadict through to_python to deal with the case where the widget doesn't return our expected type. --- wagtail/wagtailadmin/blocks.py | 7 ++++++- wagtail/wagtailadmin/widgets.py | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/wagtail/wagtailadmin/blocks.py b/wagtail/wagtailadmin/blocks.py index f529b369d..c80f87bf0 100644 --- a/wagtail/wagtailadmin/blocks.py +++ b/wagtail/wagtailadmin/blocks.py @@ -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) @@ -368,11 +368,16 @@ class PageChooserBlock(FieldBlock): return None def get_prep_value(self, value): + from wagtail.wagtailcore.models import Page if isinstance(value, Page): return value.id else: return value + def render_basic(self, value): + if value: + return format_html('{1}', value.url, value.title) + # ======= # Chooser # ======= diff --git a/wagtail/wagtailadmin/widgets.py b/wagtail/wagtailadmin/widgets.py index 946f5987e..2f445cc98 100644 --- a/wagtail/wagtailadmin/widgets.py +++ b/wagtail/wagtailadmin/widgets.py @@ -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