Как бы я использовал django.forms, чтобы предварительно заполнить поле выбора строками из модели? - PullRequest
5 голосов
/ 04 января 2011

В моем классе формы есть ChoiceField, предположительно, список пользователей.Как мне предварительно заполнить это списком пользователей из моей модели User?

Что у меня сейчас есть:

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 ]

26 голосов
/ 04 января 2011

Похоже, вы ищете 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 голос
/ 04 января 2011
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)

Это должно работать.

...