【问题标题】:KeyError generated when editing site setting with foreign key set使用外键集编辑站点设置时生成 KeyError
【发布时间】:2019-06-22 03:40:49
【问题描述】:

Django 版本: 2.1.5

Python 版本: 3.6.8

鹡鸰版本: 2.4

我有一个页脚中有四列链接的模板。我已经设置了以下模型,其中包含BaseSetting 对象和每列链接的页脚链接对象。页脚将每个 ForeignKey 对象链接到 TemplateItems 对象。

@register_setting
class TemplateItems(BaseSetting):
    page_banner = models.OneToOneField('wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+',  help_text='Banner image that shows below menu on pages other than home page')
    footer_link_col1_header = models.CharField(max_length=25, default='', verbose_name='Footer Link Column 1 Header')
    footer_link_col2_header = models.CharField(max_length=25, blank=True, default='', verbose_name='Footer Link Column 2 Header')
    footer_link_col3_header = models.CharField(max_length=25, blank=True, default='', verbose_name='Footer Link Column 3 Header')
    footer_link_col4_header = models.CharField(max_length=25, blank=True, default='', verbose_name='Footer Link Column 4 Header')

    panels = [
        ImageChooserPanel('page_banner'),
        MultiFieldPanel([
            FieldPanel('footer_link_col1_header'),
            InlinePanel('footer_links_col_1', label='Column 1 Links'),
            FieldPanel('footer_link_col2_header'),
            InlinePanel('footer_links_col_2', label='Column 2 Links'),
            FieldPanel('footer_link_col3_header'),
            InlinePanel('footer_links_col_3', label='Column 3 Links'),
            FieldPanel('footer_link_col4_header'),
            InlinePanel('footer_links_col_4', label='Column 4 Links'),
        ], heading='Footer Links'),
        InlinePanel('social_media_links', label="Social Media Links"),
    ]


class FooterLink(Orderable):
    name = models.CharField(max_length=60, default='')
    url = models.CharField(max_length=200, default='')

    panels = [
        FieldRowPanel([
            FieldPanel('name'),
            FieldPanel('url'),
        ])
    ]

    class Meta:
        abstract = True

    def __str__(self):
        return f'{self.name}'


class FooterLinkCol1(FooterLink):
    template_items = ForeignKey('TemplateItems', related_name='footer_links_col_1', null=True, on_delete=models.SET_NULL)


class FooterLinkCol2(FooterLink):
    template_items = ForeignKey('TemplateItems', related_name='footer_links_col_2', null=True, on_delete=models.SET_NULL)


class FooterLinkCol3(FooterLink):
    template_items = ForeignKey('TemplateItems', related_name='footer_links_col_3', null=True, on_delete=models.SET_NULL)


class FooterLinkCol4(FooterLink):
    template_items = ForeignKey('TemplateItems', related_name='footer_links_col_4', null=True, on_delete=models.SET_NULL)

迁移已成功创建并迁移,但是当我转到 Wagtail 管理员中的 TemplateItems 设置对象以添加页脚链接时,我收到以下错误:

/admin/settings/main/templateitems/2/ 处的 KeyError

'footer_links_col_1'

如果我注释掉任何 footer_links_col_X 项目,那么我会收到第一个未注释掉的错误。数据库中没有任何列的现有页脚链接。我想知道问题是否出现是因为 ForeignKeyBaseSetting 对象,但是当我在 Django 管理员中声明这些模型(包括每个列链接的内联)时,它会显示并允许我添加链接很好。

追溯:

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/django/core/handlers/exception.py” 在内部 34. response = get_response(request)

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/django/core/handlers/base.py” 在 _get_response 126. response = self.process_exception_by_middleware(e, request)

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/django/core/handlers/base.py” 在 _get_response 124. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/django/views/decorators/cache.py” 在 _wrapped_view_func 44. response = view_func(request, *args, **kwargs)

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/urls/init.py” 在包装中 102. return view_func(request, *args, **kwargs)

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/decorators.py” 在装饰视图中 34. return view_func(request, *args, **kwargs)

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/contrib/settings/views.py” 在编辑中 83. instance=instance, form=form, request=request)

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/edit_handlers.py” 在 bind_to_instance 153. new.on_instance_bound()

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/edit_handlers.py” 在 on_instance_bound 295. 请求=self.request))

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/edit_handlers.py” 在 bind_to_instance 153. new.on_instance_bound()

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/edit_handlers.py” 在 on_instance_bound 295. 请求=self.request))

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/edit_handlers.py” 在 bind_to_instance 153. new.on_instance_bound()

文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/site-packages/wagtail/admin/edit_handlers.py” 在 on_instance_bound 692. self.formset = self.form.formsets[self.relation_name]

异常类型:/admin/settings/main/templateitems/2/ 处的 KeyError 异常值:'footer_links_col_1'

【问题讨论】:

    标签: wagtail


    【解决方案1】:

    InlinePanel 要求对应的外键是ParentalKey

    from modelcluster.fields import ParentalKey
    
    class FooterLinkCol1(FooterLink):
        template_items = ParentalKey('TemplateItems', related_name='footer_links_col_1', null=True, on_delete=models.SET_NULL)
    

    反过来,ParentalKey 要求父模型继承自 ClusterableModel(对于 Wagtail Page 模型自动如此):

    from modelcluster.models import ClusterableModel
    
    class TemplateItems(BaseSetting, ClusterableModel):
    

    the readme for django-modelcluster 中对 ClusterableModel / ParentalKey 的动机进行了一些解释。)

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 2011-05-07
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多