如何使用django.forms将模型中的行预填充到选择字段?

14 投票
2 回答
21612 浏览
提问于 2025-04-16 09:23

我在我的表单类里有一个选择字段(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()]

撰写回答