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

时间:2011-01-04 11:55:07

标签: python django django-models 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())
          )

这似乎不起作用(否则我不会在这里)。想法?

澄清一下,当我尝试在模板中渲染此表单时,除非我删除ChoiceFields和__init__()方法,否则它不会输出任何内容。

另外,如果我只想在我的字段中列出用户的全名,该怎么办?也就是说,我想控制每个用户对象的显示输出(因此ModelChoiceField不是一个选项)。

2 个答案:

答案 0 :(得分:26)

看起来您可能正在寻找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()]

答案 1 :(得分:1)

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)

这应该有用。