implement ImageChooserBlock

This commit is contained in:
Matt Westcott 2015-02-11 11:56:43 +00:00
parent 887954ec31
commit 628b7947dc
4 changed files with 34 additions and 36 deletions

View file

@ -385,36 +385,8 @@ class PageChooserBlock(ChooserBlock):
def render_basic(self, value):
if value:
return format_html('<a href="{0}">{1}</a>', value.url, value.title)
# =======
# Chooser
# =======
class ChooserBlock(Block):
class Meta:
default = None
@property
def media(self):
return Media(js=['wagtailadmin/js/blocks/chooser.js'])
def js_initializer(self):
return "Chooser('%s')" % self.definition_prefix
def render_form(self, value, prefix='', error=None):
if self.label:
return format_html(
"""<label>{label}</label> <input type="button" id="{prefix}-button" value="Choose a thing">""",
label=self.label, prefix=prefix
)
else:
return format_html(
"""<input type="button" id="{prefix}-button" value="Choose a thing">""",
prefix=prefix
)
def value_from_datadict(self, data, files, prefix):
return 123
return ''
# ===========

View file

@ -53,6 +53,17 @@ class AdminChooser(WidgetWithScript, widgets.Input):
except model_class.DoesNotExist:
return None
def get_instance_and_id(self, model_class, value):
if value is None:
return (None, None)
elif isinstance(value, model_class):
return (value, value.pk)
else:
try:
return (model_class.objects.get(pk=value), value)
except model_class.DoesNotExist:
return (None, None)
def value_from_datadict(self, data, files, name):
# treat the empty string as None
result = super(AdminChooser, self).value_from_datadict(data, files, name)
@ -83,11 +94,7 @@ class AdminPageChooser(AdminChooser):
def render_html(self, name, value, attrs):
model_class = self.target_content_type.model_class()
if isinstance(value, model_class):
instance = value
value = value.pk
else:
instance = self.get_instance(model_class, value)
instance, value = self.get_instance_and_id(model_class, value)
original_field_html = super(AdminPageChooser, self).render_html(name, value, attrs)

View file

@ -0,0 +1,20 @@
from django.utils.functional import cached_property
from wagtail.wagtailadmin.blocks import ChooserBlock
class ImageChooserBlock(ChooserBlock):
@cached_property
def target_model(self):
from wagtail.wagtailimages.models import get_image_model
return get_image_model()
@cached_property
def widget(self):
from wagtail.wagtailimages.widgets import AdminImageChooser
return AdminImageChooser
def render_basic(self, value):
if value:
return value.get_rendition('original').img_tag()
else:
return ''

View file

@ -19,10 +19,9 @@ class AdminImageChooser(AdminChooser):
self.image_model = get_image_model()
def render_html(self, name, value, attrs):
instance, value = self.get_instance_and_id(self.image_model, value)
original_field_html = super(AdminImageChooser, self).render_html(name, value, attrs)
instance = self.get_instance(self.image_model, value)
return render_to_string("wagtailimages/widgets/image_chooser.html", {
'widget': self,
'original_field_html': original_field_html,