Reputation: 611
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).
Upvotes: 14
Views: 22794
Reputation: 99811
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()]
Upvotes: 44
Reputation: 926
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)
This should work.
Upvotes: -3