Admin formfield validation uses form model instead of registered model
|Reported by:||David Bennett||Owned by:||dante87|
|Cc:||Per Rosengren||Triage Stage:||Ready for checkin|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
The admin check_formfield validation function is checking for fields in the form's model (if specified) by default.
Meanwhile, the ModelAdmin get_form method always overrides the form's model with the registered model.
So, doing something like this generates a validation error saying that field2 is missing from the form:
class Base(models.Model): field1 = models.CharField(max_length=10) class Sub(Base): field2 = models.CharField(max_length=10) class BaseForm(forms.ModelForm): class Meta: model = Base class BaseAdmin(admin.ModelAdmin): form = BaseForm class SubAdmin(BaseAdmin): fields = ('field1', 'field2') admin.site.register(Sub, SubAdmin)
It would appear to me that fields shouldn't be validated against the form's model as it isn't actually used.
I've managed to work around it with the following:
class SubAdmin(BaseAdmin): form = forms.ModelForm fields = ('field1', 'field2') def __init__(self, model, admin_site): self.form = BaseForm super(SubAdmin, self).__init__(model, admin_site)
This causes check_formfield to use the registered model's fields for validation, but then swaps in the original form on init.