Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How would I use django.forms to prepopulate a choice field with rows from a model?

I have a ChoiceField in my form class, presumably a list of users. How do I prepopulate this with a list of users from my User model?

What I have now is:

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())
          )

This doesn't seem to work (otherwise I wouldn't be here). Thoughts?

To clarify, when I attempt to render this form in a template, it simply outputs nothing, unless I remove the ChoiceFields and __init__() method.

Also, what if I only want a list of the users' full names in my field? That is, I'd like to control the display output of each user object (so ModelChoiceField isn't really an option).

like image 396
Sri Raghavan Avatar asked Jan 04 '11 11:01

Sri Raghavan


1 Answers

It looks like you may be looking for ModelChoiceField.

user2 = forms.ModelChoiceField(queryset=User.objects.all())

This won't show fullnames, though, it'll just call __unicode__ on each object to get the displayed value.

Where you don't just want to display __unicode__, I do something like this:

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()]
like image 178
Dominic Rodger Avatar answered Sep 21 '22 22:09

Dominic Rodger