我是Wagtail的新手,并希望通过遍历像这样的名称列表来在我的model.py中创建几个Field。
class HomePage(Page):
myFields = [ ('paragraph', blocks.RichTextBlock(classname="oneA")),('image', ImageChooserBlock()) ]
mySections = ['sectionOne', 'sectionTwo', 'sectionThree']
for mySection in mySections:
mySection = StreamField(myFields,null=True,blank=True)
content_panels = Page.content_panels + [
StreamFieldPanel('sectionOne'), StreamFieldPanel('sectionTwo'), StreamFieldPanel('sectionThree'),
]
这会产生一条错误消息...
django.core.exceptions.FieldDoesNotExist:主页上没有名为“ sectionOne”的字段
有没有办法做到这一点,或者我必须像这样分别声明每个人:
sectionOne = StreamField(myFields,null=True,blank=True)
答案 0 :(得分:2)
这是行不通的,因为mySection = StreamField(...)
只是重复定义了一个名为mySection
的字段-Python无法知道要使用当前名称为的字段来定义字段 mySection
。
我认为实现此目的的唯一方法是在元类中设置字段,几乎可以肯定,与仅重复该行相比,这将更加复杂且可读性较低。参见How to dynamically set attributes to a class in models in Django?,Dynamically create class attributes