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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With