diff --git a/wagtail/wagtailadmin/blocks.py b/wagtail/wagtailadmin/blocks.py
index c80f87bf0..ec05e121b 100644
--- a/wagtail/wagtailadmin/blocks.py
+++ b/wagtail/wagtailadmin/blocks.py
@@ -349,31 +349,39 @@ class RichTextBlock(FieldBlock):
def render_basic(self, value):
return mark_safe('
' + expand_db_html(value) + '
')
-class PageChooserBlock(FieldBlock):
+
+class ChooserBlock(FieldBlock):
+ """Abstract superclass for fields that implement a chooser interface (page, image, snippet etc)"""
@cached_property
def field(self):
- from wagtail.wagtailcore.models import Page # TODO: allow limiting to specific page types
- from wagtail.wagtailadmin.widgets import AdminPageChooser
- return ModelChoiceField(queryset=Page.objects.all(), widget=AdminPageChooser)
+ return ModelChoiceField(queryset=self.target_model.objects.all(), widget=self.widget)
def to_python(self, value):
- from wagtail.wagtailcore.models import Page
-
- if value is None or isinstance(value, Page):
+ if value is None or isinstance(value, self.target_model):
return value
else:
try:
- return Page.objects.get(pk=value) # TODO: use the specific class in place of Page where appropriate
- except Page.DoesNotExist:
+ return self.target_model.objects.get(pk=value)
+ except self.target_model.DoesNotExist:
return None
def get_prep_value(self, value):
- from wagtail.wagtailcore.models import Page
- if isinstance(value, Page):
+ 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 AdminPageChooser
+
def render_basic(self, value):
if value:
return format_html('{1}', value.url, value.title)