Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从循环中创建类dict条目的更好方法,而不是locals()_Python_Django_Wagtail - Fatal编程技术网

Python 从循环中创建类dict条目的更好方法,而不是locals()

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语句

有人告诉我,在Python中使用locals()动态创建变量的形式不好。但是,我正在编写一个类(使用Django和Wagtail),我确实需要将这些东西放在类dict中,即
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中,我不确定它是如何工作的