Opened 13 years ago
Closed 12 years ago
#17428 closed Bug (wontfix)
Admin formfield validation uses form model instead of registered model
Reported by: | David Bennett | Owned by: | dante87 |
---|---|---|---|
Component: | contrib.admin | Version: | 1.3 |
Severity: | Normal | Keywords: | |
Cc: | Per Rosengren | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | yes | UI/UX: | no |
Description
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.
Change History (6)
comment:1 by , 13 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 13 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:3 by , 12 years ago
comment:4 by , 12 years ago
Cc: | added |
---|---|
Has patch: | set |
comment:5 by , 12 years ago
Triage Stage: | Accepted → Ready for checkin |
---|
comment:6 by , 12 years ago
Resolution: | → wontfix |
---|---|
Status: | assigned → closed |
This validation appears to have been removed in [1556b1c3b7] and [1e37cb37cec].
I submitted a fix for this in https://github.com/django/django/pull/528
It is my first contribution, so it probably has lots of problems.
My fix is this(see github for details and unit test):