我有一个带自定义验证的管理表单。某些表单字段通过list_editable显示在列表视图中。当我通过列表视图修改这些字段时,自定义验证不起作用。但是,当我使用常规更改表单时,它确实有效。所以问题是如何通过“change_list”页面验证所做的更改。
代码可能会更清晰
class ProjectForm(ModelForm):
class Meta:
model = Project
def clean(self):
print "validating!"
data = self.cleaned_data
if data.get('on_frontpage') and not data.get('frontpage_image'):
raise ValidationError('To put a project on the frontpage you must \
specify a "Frontpage image" first.')
return data
class ProjectAdmin(AdminImageMixin, DisplayableAdmin, SortableAdmin):
form = ProjectForm
...
list_editable = ("status", "on_frontpage",)
list_display = ("title", "status", "on_frontpage")
谢谢!
答案 0 :(得分:4)
找到它。可以通过覆盖ModelAdmin中的“get_changelist_formset”方法来指定“change_list”页面上使用的表单: https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L524
答案 1 :(得分:0)
覆盖ModelAdmin.get_changelist_formset(request, **kwargs)
方法:
from django.forms import BaseModelFormSet
class MyAdminFormSet(BaseModelFormSet):
pass
class MyModelAdmin(admin.ModelAdmin):
def get_changelist_formset(self, request, **kwargs):
kwargs['formset'] = MyAdminFormSet
return super().get_changelist_formset(request, **kwargs)
有关详细信息,请查看Django admin site documentation。
答案 2 :(得分:0)
我认为@Jorge Barata是正确的answer,非常感谢。
请允许我在此处附上成功示例。
class MyAdminFormSet(BaseModelFormSet):
def clean(self):
form_set = self.cleaned_data
for form_data in form_set:
if form_data['field1'] != form_data['field2']:
raise forms.ValidationError(f'Item: {form_data["id"]} is not valid')
return form_set
在Django 2.2上测试