您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

django-如何交叉检查ModelAdmin及其内联?

django-如何交叉检查ModelAdmin及其内联?

我从admin.ModelAdmin继承了一个名为ModelAdminWithInline的新类,并修改方法add_view(…)和change_view(…)以调用函数is_cross_valid(self,form,formets),您可以在其中一起验证所有表单。这两个功能都具有:

#...
if all_valid(formsets) and form_validated:
#...

变成:

#...
formsets_validated = all_valid(formsets)
cross_validated = self.is_cross_valid(form, formsets)
if formsets_validated and form_validated and cross_validated:
#...

函数is_cross_valid(…)的定义如下:

def is_cross_valid(self, form, formsets):
  return True

因此,如果您不更改is_cross_valid(…)函数,则新类应与ModelAdmin完全相同。

现在我的admin.py看起来像这样:

###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)

解决方案有点黑,但它可以工作:)。错误显示方式与常规ModelForm和ModelAdmin类相同。Django 1.2(应该很快发布)应该具有模型验证功能,因此我希望可以更好地解决此问题。

Go 2022/1/1 18:39:27 有322人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶