<p>我从继承了一个名为modeldAdminWithInline的新类管理模型管理员而修改后的方法add_view(…)和change_view(…)调用函数is_cross_valid(self,form,formsets),可以一起验证所有表单。
两种功能都有:</p>
<pre><code>#...
if all_valid(formsets) and form_validated:
#...
</code></pre>
<p>更改为:</p>
^{pr2}$
<p>新函数is_cross_valid(…)的定义如下:</p>
<pre><code>def is_cross_valid(self, form, formsets):
return True
</code></pre>
<p>因此,如果不更改is_cross_valid(…)函数,新类的工作方式应该与ModelAdmin完全相同。在</p>
<p>现在我的管理员py看起来像这样:</p>
<pre><code>###admin.py###
class ModelAdminWithInline(admin.ModelAdmin):
def is_cross_valid(self, form, formsets):
return True
def add_view(self, request, form_url='', extra_context=None):
#modified code
def change_view(self, request, object_id, extra_context=None):
#modified code
class ModelChildInline(admin.TabularInline):
model = ModelChild
class ModelParentAdmin(ModelAdminWithInline):
inlines = [ModelChildInline]
def is_cross_valid(self, form, formsets):
#Do some cross validation on forms
#For example, here is my particular validation:
valid = True
if hasattr(form, 'cleaned_data'):
subjects_parent = form.cleaned_data.get("subjects_parent")
#You can access forms from formsets like this:
for formset in formsets:
for formset_form in formset.forms:
if hasattr(formset_form, 'cleaned_data'):
subjects_child = formset_form.cleaned_data.get("subjects_child")
delete_form = formset_form.cleaned_data.get("DELETE")
if subjects_child and (delete_form == False):
for subject in subjects_child:
if subject in subjects_parent:
valid = False
#From here you can still report errors like in regular forms:
if "subjects_child" in formset_form.cleaned_data.keys():
formset_form._errors["subjects_child"] = ErrorList([u"Subject %s is already selected in parent ModelParent" % subject])
del formset_form.cleaned_data["subjects_child"]
else:
formset_form._errors["subjects_child"] += ErrorList(u"Subject %s is already selected in parent ModelParent" % subject])
#return True on success or False otherwise.
return valid
admin.site.register(ModelParent, ModelParentAdmin)
</code></pre>
<p>这个解决方案有点老套,但它很管用:)。显示的错误与常规ModelForm和ModelAdmin类的错误相同。django1.2(应该很快发布)应该有模型验证,所以我希望这个问题可以得到更好的解决。在</p>