ModelChoiceField allows you to use filtered queries to simplify your forms. This is great for adding objects but can fall down when you edit an existing object and the original query no longer contains the referenced field (e.g. I like to use an "active" field in several objects).
The fix is simply to include an extra param: Q(pk=object_id). You have to do this in the init method to get the object_id.
A nice thing about this is that it works for ModelForms as well as custom Forms.
1 2 3 4 5 6 7 8 9 10 | class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['myfield'].queryset = \
MyOtherModel.objects.filter(
Q(active=True)|Q(pk=self.instance.myfield_id))
class Meta:
model = MyModel
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 11 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months, 2 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 6 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 7 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
Thanks for this Rob, I was just trying to figure this out today...
#
Much cleaner than the hack I was using for this. Thanks!
#
Please login first before commenting.