Wagtail设置中用Orderable嵌套PageChooserPanel报bind_to属性错误
问题:Wagtail设置页面使用Orderable嵌套PageChooserPanel报错AttributeError
尝试在Wagtail中创建设置页面,手动选择1-5个页面作为网站“最受欢迎页面”展示,使用Orderable嵌套PageChooserPanel时,出现错误:AttributeError: 'list' object has no attribute 'bind_to'
错误原因
代码中MostPopularPosts类的panels定义末尾多了一个逗号,导致panels被解析为元组而非列表。Wagtail的编辑处理器尝试调用bind_to方法时,会把元组里的列表当作子处理器,而列表没有bind_to方法,从而触发报错。同时,MostPopularPostPages的ParentalKey缺少related_name参数,会导致InlinePanel无法正确关联嵌套模型。
修正后的代码
from django.db import models from wagtail.core.models import Page, Orderable from wagtail.admin.edit_handlers import PageChooserPanel, FieldPanel, MultiFieldPanel, InlinePanel from wagtail.contrib.settings.models import BaseSetting, register_setting from modelcluster.fields import ParentalKey from modelcluster.models import ClusterableModel @register_setting class MostPopularPosts(BaseSetting, ClusterableModel): display_most_popular_posts_in_sidebar = models.BooleanField( "Display most popular posts in sidebar", default=True, help_text='Untick to hide the most popular posts widget' ) # 移除末尾逗号,确保panels为列表类型 panels = [ FieldPanel('display_most_popular_posts_in_sidebar'), InlinePanel('popular_page', max_num=5, min_num=1, label="Post"), ] class MostPopularPostPages(Orderable): # 补充related_name,与InlinePanel的关联名匹配 settings_page = ParentalKey(MostPopularPosts, related_name='popular_page') popular_page = models.ForeignKey( 'wagtailcore.Page', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', verbose_name="Page Link" ) panels = [ PageChooserPanel('popular_page'), ]
关键修正点
- 移除
MostPopularPosts类中panels列表末尾的逗号,避免被解析为元组 - 给
MostPopularPostPages的ParentalKey添加related_name='popular_page',确保与InlinePanel指定的关联名一致,解决数据库关联问题
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

