以Django形式定义字段的方法

时间:2015-05-15 14:45:18

标签: python django

我用以下两种方式定义django形式的字段:

class MyForm(forms.Form):
    myfield = forms.ChoiceField(choices=[(u.id,u.username) for u in User.objects.filter(type="TYPE1")])

OR

class MyForm(forms.Form):
    pass

    def_init_(self,*args,**kwargs):
        super(MyForm,self)._init_(*args,**kwargs)
        self.fields['myfield'] = forms.ChoiceField(choices=[(u.id,u.username) for u in User.objects.filter(type="TYPE1")])

这两种方法之间有什么不同吗?我试图在网上找到这个,但没有得到任何相关的答案。

3 个答案:

答案 0 :(得分:0)

首先,有一个专门的领域来处理这些事情 - ModelChoiceField

在您的示例中,区别在于代码执行的时刻。

在第一种方法中,它在加载带有表单的模块时执行,第二种 - 每次初始化表单时(基本上每次请求到您的视图)。所以第一种方法有问题 - 用户将在第一次请求时加载。如果任何用户在此时间之后注册 - 在重新启动服务器之前,他将不会出现在选择字段中。

此外,我认为在{{FooBarFactory.fooStuff.fooName}}方法中引入新字段是一种不好的做法。如果你真的需要这样的东西而你不能使用__init__,那么更好的方法是

ModelChoiceField

答案 1 :(得分:0)

使用第一种方式运行服务器时是否出现错误?

class MyForm(forms.Form):
    myfield = forms.ChoiceField(choices=[(u.id,u.username) for u in User.objects.filter(type="TYPE1")])

如果使用此方法,则在读取文件时将执行for。尝试使用第二种方式或函数执行for并设置选项。

答案 2 :(得分:0)

通常在Form.__init__中定义一些动态字段(例如,您要显示一些复选框,根据某些模型中的数据设置/取消设置)。在所有其他情况下,第一种方法更好,因为它更具可读性。