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

Sri*_*van 6 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())
          )
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用(否则我不会在这里).思考?

为了澄清,当我尝试在模板中渲染此表单时,它只是输出任何内容,除非我删除ChoiceFields和__init__()方法.

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

Dom*_*ger 29

看起来你可能正在寻找ModelChoiceField.

user2 = forms.ModelChoiceField(queryset=User.objects.all())
Run Code Online (Sandbox Code Playgroud)

但是,这不会显示全名,它只会调用__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()]
Run Code Online (Sandbox Code Playgroud)