Django ModelForm 覆盖 __init__
Posted
技术标签:
【中文标题】Django ModelForm 覆盖 __init__【英文标题】:Django ModelForm overriding __init__ 【发布时间】:2016-03-20 02:45:13 【问题描述】:我正在尝试使用当前用户所属的 Django 组填充 ModelForm 的 Select 列表。
没有出现错误,但我只得到一个空的选择列表。
这是我的代码:
class ArchiveForm(forms.ModelForm):
class Meta:
model = Archive
fields = ['tags', 'version', 'sharegp']
localized_fields = None
labels = 'tags': 'Related Keywords'
sharegp = forms.ChoiceField(label='Share with groups')
def __init__(self, user, *args, **kwargs):
#import pudb;pudb.set_trace()
self.user = user
super(ArchiveForm, self).__init__(*args, **kwargs)
self.fields['sharegp'].queryset = Group.objects.filter(user=self.user)
self.fields['sharegp'].widget.choices = self.fields['sharegp'].choices
请注意,如果我在__init__
方法的第一行中启用调试器,并沿该函数前进,则该行:
self.fields['sharegp'].queryset
提供包含该用户组的正确列表,但不会传递给实际表单。
我会错过什么?谢谢!
【问题讨论】:
【参考方案1】:这就是我最终解决这个问题的方法:
我选错了字段类型:正确的是ModelChoiceField:
class ArchiveForm(forms.ModelForm):
class Meta:
model = Archive
fields = ['tags', 'version', 'sharegp']
localized_fields = None
labels = 'tags': 'Related Keywords'
user = None
usergroups = None
sharegp = forms.ModelChoiceField(label='Share with groups', queryset=usergroups)
def __init__(self, user, *args, **kwargs):
self.user = user
self.usergroups = Group.objects.filter(user=self.user)
super(ArchiveForm, self).__init__(*args, **kwargs)
self.fields['sharegp'].queryset = self.usergroups
【讨论】:
【参考方案2】:最后一行覆盖了前一行中分配的查询集。删除它。
【讨论】:
AFAIK 它正在覆盖表单小部件的选择集,我同意这种覆盖是多余的,但根本没有查询集的橡皮擦。 我不确定,但@daniel-roseman 是一个答案,或者它可能是对答案的评论?以上是关于Django ModelForm 覆盖 __init__的主要内容,如果未能解决你的问题,请参考以下文章