Im Using a ModelForm for creating a form from a model for using in various places on my site. The form has a Foreign Key field which needs to be filtered based on the user. I have successfully done this using:
class TestForm(ModelForm):
def __init__(self,user,*args,**kwargs):
super (TestForm,self ).__init__(*args,**kwargs) # populates the post
self.fields['controller'].queryset = Controller.objects.filter(user=user)
class Meta:
model = Test
exclude = ['customer']
And then in my view using: form = TestForm(user)
This is working fine for my forms outside of Django Admin, but my site requires that the model be editable inside Django Admin aswell. So I used this code for my ModelAdmin, based on the Django Docs
class TestAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
kwargs['form'] = SuTestForm
else:
kwargs['form'] = TestForm(request.user)
return super(TestAdmin, self).get_form(request, obj, **kwargs)
I would think this should work just as is does for my other forms but i am getting this error back from django: invalid literal for int() with base 10: 'TestForm'
After a bit of googeling i came across this approach which puts the queryset filtering inside the ModelAdmin:
form = super(TestAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['controller_fk'].queryset = Controller.objects.filter(custid=cust)
return form
This works perfectly fine but it does require me to create multiple copies of my ModelForm which doesn't seem very dry. So i guess does anyone know how to get my ModelForm queryset returned into the ModelAdmin form?
get_formmethod and see what happens? - Serafeim