Python 从循环中创建类dict条目的更好方法,而不是locals()
有人告诉我,在Python中使用locals()动态创建变量的形式不好。但是,我正在编写一个类(使用Django和Wagtail),我确实需要将这些东西放在类dict中,即Python 从循环中创建类dict条目的更好方法,而不是locals(),python,django,wagtail,Python,Django,Wagtail,有人告诉我,在Python中使用locals()动态创建变量的形式不好。但是,我正在编写一个类(使用Django和Wagtail),我确实需要将这些东西放在类dict中,即class语句的局部变量中,而不是放在单独的数据结构中: class BlogPage(Page): for language in languages: locals()['body_' + language] = RichTextField(blank=True) 我也不认为我可以在class语句
class
语句的局部变量中,而不是放在单独的数据结构中:
class BlogPage(Page):
for language in languages:
locals()['body_' + language] = RichTextField(blank=True)
我也不认为我可以在class语句之后用setattr
设置这些,因为Django的元类处理在那时已经发生了
有更好的方法吗?将不同语言作为模型属性的问题是,更改语言需要迁移数据库。如果你能帮助的话,这不是你想做的事情 解决这个问题的正确方法是使用一个单独的模型,将页面和语言映射到适当的内容
class BlogPageTranslation(model.Model):
language = TextField()
blogpage = ForeignKey(BlogPage)
content = RichTextField()
然后在查询页面时,使用所需语言和正常默认值查找翻译,然后选择适当的行
xlatcontents = BlogPageTranslation.filter(blogpage=Page,
language__in=[someLanguage, 'en'])
somethingsomething(xlatcontents, someLanguage)
或许可以使用字典……好吧,对于类语句,特别是如果元类做了任何重要的工作(在这里似乎很有可能),
locals()
实际上可能是合理的(并且可能会真正起作用,不像在函数中修改locals()
)。更好的方法是根本不这样做,而是使用某种容器。RichTextField是什么?听起来与Django相关,但似乎有多个库为Django提供了RichTextField。另外,什么是页面?RichTextField是Wagtail的字段类型,Wagtail是一种基于Django的CMS。页面是特定的博客条目。因此将有多个页面
s类BlogPage。我不需要修改这些富文本字段,实际上,稍后会有一个过程content\u panels=Page.content\u panels+[FieldPanel('body\u en'),
其中的'body\u en'需要匹配上面的RichTextField声明,所以如果它在dict中,我不确定它是如何工作的