代码之家  ›  专栏  ›  技术社区  ›  Dan Swain

使用外键集编辑站点设置时生成KeyError

  •  1
  • Dan Swain  · 技术社区  · 7 年前

    2.1.5

    Python版本: 3.6.8

    摇摆版本:

    我有一个在页脚有四列链接的模板。我建立了以下模型,其中包括 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)
    

    迁移已成功创建和迁移,但当我转到

    位于/admin/settings/main/templateitems/2的键错误/

    “页脚链接列1”

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

    回溯:

    “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/django/core/handlers/exception.py” 在内部 34响应=获取响应(请求)

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/django/core/handlers/base.py” 你得到了什么回应 126response=self.process\u异常\u由\u中间件(e,请求)

    文件 124响应=包装的回调(请求,*回调参数,**回调参数)

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/django/views/decorators/cache.py” 44响应=查看功能(请求,*args,**kwargs)

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE-packages/wagtail/admin/url/ 初始化 .py“ 包装中

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/wagtail/admin/decorators.py” 在你看来 34返回视图功能(请求,*args,**kwargs)

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/wagtail/contrib/settings/views.py” 编辑中 83实例=实例,形式=形式,请求=请求)

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/wagtail/admin/edit_handlers.py” 在绑定到实例中 153new.on_实例_绑定()

    “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/wagtail/admin/edit_handlers.py” 在on_实例_绑定中

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/wagtail/admin/edit_handlers.py” 在绑定到实例中 153new.on_实例_绑定()

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/wagtail/admin/edit_handlers.py” 在on_实例_绑定中 295请求=self.request)

    在绑定到实例中

    文件 “/opt/virtualenvs/MY_SITE-a0hNfZxl/lib/python3.6/SITE packages/wagtail/admin/edit_handlers.py” 在on_实例_绑定中

    异常类型:keyrerror位于/admin/settings/main/templateitems/2/ 异常值:“页脚链接列1”

    1 回复  |  直到 7 年前
        1
  •  3
  •   gasman    7 年前

    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 Page 型号):

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

    (关于ClusterableModel/ParentalKey的动机,在 the readme for django-modelcluster .)