Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to dynamically set the queryset of a models.ModelChoiceField on a forms.Form subclass

The constructor for forms.ModelChoiceField requires a queryset. I do not know the queryset until the request happens. Distilled:

# models.py class Bar(models.model):     text = models.TextField()  class Foo(models.Model):     name = models.CharField()     bar = models.ForeignKey(Bar)  # forms.py class FooForm(forms.Form):     name = forms.CharField()     text = forms.CharField(widget=forms.TextArea)      bar = forms.ModelChoiceField(queryset='??????') 

What I am currently doing:

# forms.py  def get_foo_form_class(bars_queryset):     class FooForm(forms.Form):         name = forms.CharField()         text = forms.CharField(widget=forms.TextArea)          bar = forms.ModelChoiceField(queryset=bars_queryset)      return FooForm 

I can then call it in the view using arguments parsed out of the url with a urlconf to construct the queryset and get the class. This feels like the wrong way to do it. Is there an established way to do this in django?

like image 329
knucklebumpler Avatar asked Feb 02 '11 22:02

knucklebumpler


1 Answers

Override the form's __init__ method and set the queryset there.

class FooForm(forms.Form):     bar = forms.ModelChoiceField(queryset=Bar.objects.none())      def __init__(self, *args, **kwargs):         qs = kwargs.pop('bars')         super(FooForm, self).__init__(*args, **kwargs)         self.fields['bar'].queryset = qs 
like image 62
Daniel Roseman Avatar answered Oct 09 '22 08:10

Daniel Roseman