如何通过ParentalManyToManyField选择Wagtail图片?
解决Wagtail 1.13中ParentalManyToManyField图片展示区的问题
嘿,我看你在配置HomePage的图片展示区时踩了两个关键小坑,导致代码没法正常工作,我来帮你修正并解释清楚:
你代码里的问题
- 错误使用InlinePanel:
InlinePanel是用来处理通过ParentalKey关联的嵌套内联模型的,而ParentalManyToManyField是直接的多对多关联,不能用它来渲染。 - 字段参数错误:
blank="true"是字符串写法,Django模型字段的blank参数需要布尔值True,字符串不会被正确识别。
修正后的代码(直接多对多关联图片)
如果你只是需要简单地从图片库选择多张展示,用下面的代码就可以:
from django.db import models from wagtail.wagtailcore.models import Page from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel from wagtail.wagtailimages.edit_handlers import AdminManyToManyChooser from wagtail.wagtailimages.models import Image class HomePage(Page): showcase_title = models.CharField(max_length=100, blank=True, default="SHOWCASE") showcase_images = models.ParentalManyToManyField(Image) content_panels = Page.content_panels + [ MultiFieldPanel([ FieldPanel('showcase_title'), # 用AdminManyToManyChooser提供多选图片的友好界面 FieldPanel('showcase_images', widget=AdminManyToManyChooser), ], heading="Image Showcase"), ]
更灵活的替代方案(带自定义字段的内联面板)
如果之后你想给每张展示的图片加标题、描述这类自定义内容,或者需要排序,那更推荐用内联模型的方式,代码如下:
from django.db import models from wagtail.wagtailcore.models import Page, Orderable from wagtail.wagtailadmin.edit_handlers import FieldPanel, InlinePanel, MultiFieldPanel from wagtail.wagtailimages.edit_handlers import ImageChooserPanel from wagtail.wagtailimages.models import Image from modelcluster.fields import ParentalKey # 嵌套的内联模型,用来存储每张展示图片的信息 class HomePageShowcaseImage(Orderable): page = ParentalKey(HomePage, related_name='showcase_images') image = models.ForeignKey(Image, on_delete=models.CASCADE, related_name='+') caption = models.CharField(max_length=255, blank=True) # 自定义图片标题 panels = [ ImageChooserPanel('image'), FieldPanel('caption'), ] class HomePage(Page): showcase_title = models.CharField(max_length=100, blank=True, default="SHOWCASE") content_panels = Page.content_panels + [ MultiFieldPanel([ FieldPanel('showcase_title'), # 用InlinePanel渲染嵌套的图片条目,支持添加、删除、排序 InlinePanel('showcase_images', label="Showcase Image"), ], heading="Image Showcase"), ]
这两种方案都能适配你当前的Wagtail 1.13、Django 1.11.11和Python 2.7.12环境,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者Dan Swain
相关产品推荐
相关产品推荐

