如何使用django.forms将模型中的行预填充到选择字段?
我在我的表单类里有一个选择字段(ChoiceField),这个字段应该是一个用户列表。我想知道怎么把这个字段预先填充上我的用户模型里的用户列表。
我现在的代码是:
class MatchForm(forms.Form):
choices = []
user1_auto = forms.CharField()
user1 = forms.ChoiceField(choices=choices)
user2_auto = forms.CharField()
user2 = forms.ChoiceField(choices=choices)
def __init__(self):
user_choices = User.objects.all()
for choice in user_choices:
self.choices.append(
(choice.id, choice.get_full_name())
)
这似乎不太管用(要不然我也不会来这里问了)。大家有什么想法吗?
为了更清楚一点,当我试图在模板中显示这个表单时,它什么都不显示,除非我把选择字段和__init__()
方法去掉。
另外,如果我只想在这个字段里显示用户的全名呢?也就是说,我想控制每个用户对象的显示内容(所以ModelChoiceField
其实不太适合)。
2 个回答
-3
class MatchForm(forms.Form):
choices = tuple(User.objects.all().values_list())
user1_auto = forms.CharField()
user1 = forms.ChoiceField(choices=choices)
user2_auto = forms.CharField()
user2 = forms.ChoiceField(choices=choices)
这个应该可以正常工作。
44
看起来你可能在寻找 ModelChoiceField
。
user2 = forms.ModelChoiceField(queryset=User.objects.all())
不过,这个不会显示全名,它只是会对每个对象调用 __unicode__
来获取要显示的值。
如果你不想仅仅显示 __unicode__
,我会这样做:
class MatchForm(forms.Form):
user1 = forms.ChoiceField(choices = [])
def __init__(self, *args, **kwargs):
super(MatchForm, self).__init__(*args, **kwargs)
self.fields['user1'].choices = [(x.pk, x.get_full_name()) for x in User.objects.all()]