如何在ParentalManyToManyField中选择Wagtail图像?

时间:2018-03-27 21:19:11

标签: django wagtail

环境:

Wagtail 1.13

Django版本:1.11.11

Python版本:2.7.12

我跟随Wagtail documentation尝试使用ParentalManyToManyField向页面添加图片展示(不是类别):

class HomePage(Page):
    showcase_title = models.CharField(max_length=100, blank="true", default="SHOWCASE")
    showcase_images = ParentalManyToManyField('wagtailimages.Image')

    content_panels = Page.content_panels + [
        FieldPanel('showcase_title'),
        InlinePanel('showcase_images', label="Showcase images", panels=[
            ImageChooserPanel('showcase_images')
        ]),
    ]

如果我注释掉showcase_images编辑面板,一切都会好的,但是一旦取消注释面板showcase_images,我就会收到KeyError。除了上述编辑showcase_images的变体形式之外,我还尝试了InlinePanel('showcase_images')FieldPanel('showcase_images')InlinePanel('showcase_images', label="Showcase images", panels=[ImageChooserPanel('image')]),可能还有另外两种变体。有人可以提出解决方案吗?

Environment:


Request Method: GET
Request URL: http://dev.somedomain.com:8181/admin/pages/3/edit/

Django Version: 1.11.11
Python Version: 2.7.12
Installed Applications:
[u'my_app',
 u'search',
 u'wagtail.wagtailforms',
 u'wagtail.wagtailredirects',
 u'wagtail.wagtailembeds',
 u'wagtail.wagtailsites',
 u'wagtail.wagtailusers',
 u'wagtail.wagtailsnippets',
 u'wagtail.wagtaildocs',
 u'wagtail.wagtailimages',
 u'wagtail.wagtailsearch',
 u'wagtail.wagtailadmin',
 u'wagtail.wagtailcore',
 u'wagtail.contrib.wagtailstyleguide',
 u'modelcluster',
 u'taggit',
 u'wagtailfontawesome',
 u'django.contrib.admin',
 u'django.contrib.auth',
 u'django.contrib.contenttypes',
 u'django.contrib.sessions',
 u'django.contrib.messages',
 u'django.contrib.staticfiles']
Installed Middleware:
[u'django.contrib.sessions.middleware.SessionMiddleware',
 u'django.middleware.common.CommonMiddleware',
 u'django.middleware.csrf.CsrfViewMiddleware',
 u'django.contrib.auth.middleware.AuthenticationMiddleware',
 u'django.contrib.messages.middleware.MessageMiddleware',
 u'django.middleware.clickjacking.XFrameOptionsMiddleware',
 u'django.middleware.security.SecurityMiddleware',
 u'wagtail.wagtailcore.middleware.SiteMiddleware',
 u'wagtail.wagtailredirects.middleware.RedirectMiddleware']



Traceback:

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/django/views/decorators/cache.py" in _cache_controlled
  43.             response = viewfunc(request, *args, **kw)

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/wagtail/wagtailadmin/urls/__init__.py" in wrapper
  96.             return view_func(request, *args, **kwargs)

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/wagtail/wagtailadmin/decorators.py" in decorated_view
  31.             return view_func(request, *args, **kwargs)

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/wagtail/wagtailadmin/views/pages.py" in edit
  481.         edit_handler = edit_handler_class(instance=page, form=form)

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/wagtail/wagtailadmin/edit_handlers.py" in __init__
  269.             self.children.append(child(instance=self.instance, form=self.form))

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/wagtail/wagtailadmin/edit_handlers.py" in __init__
  269.             self.children.append(child(instance=self.instance, form=self.form))

File "/opt/virtualenvs/gmmiTMID/lib/python2.7/site-packages/wagtail/wagtailadmin/edit_handlers.py" in __init__
  693.         self.formset = form.formsets[self.__class__.relation_name]

Exception Type: KeyError at /admin/pages/3/edit/
Exception Value: u'showcase_images'

1 个答案:

答案 0 :(得分:1)

InlinePanel不适用于ParentalManyToManyField关系,仅适用于ParentalKey关系。您需要设置一个中间模型来定义页面和图像之间的关系,例如tutorial's 'images' section中的BlogPageGalleryImage(但在这种情况下省略caption字段,所以它只是页面和图像之间的直接关联)。

(或者,你可以使用普通FieldPanelParentalManyToManyField,但这只会给你一套系统中所有图像的复选框,而不是图像选择器界面。)< / p>