Django对内联表单的管理验证,它依赖于所有表单之间的字段总数

use*_*888 16 django validation inline admin

请原谅我,如果之前已经回答过,我找不到答案,其中验证取决于内联表格的汇总.

一点背景:我正在为一家保险经纪人做一个网站,该网站有"政策"和该政策的"全面委员会".还有"经销商"被添加到"政策"中,并附带佣金(可以有任意数量的经销商).经销商之间的佣金总额必须低于佣金总额.

我有一个策略的admin.ModelForm,下面我有一个admin.InlineTabular,通过"添加"按钮可以有多个经销商,这一切都很完美.

但是,我似乎无法弄清楚如何对它们进行验证,因此我基本上可以将所有佣金加起来然后如果它大于总佣金则抛出ValidationError.

我已经尝试过clean()但是如果它甚至可用,我不知道如何访问InlineTabular清理数据!

在此先感谢您的帮助!

托马斯

Thi*_*t J 25

我知道很久以前就问过这个问题,但是由于我遇到了同样的问题,我认为这可能是有用的.

这里的关键是定义一个自定义formset嵌入到表格管理表单中,然后覆盖formset clean的方法.

这是一个例子:一个组合由composition_elements组成,每个composition_element都有一个百分比字段,我想验证总百分比是否等于100.

from django import forms
from django.forms.models import BaseInlineFormSet
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from django.contrib import admin
from .models import Composition, CompositionElement

class CompositionElementFormSet(BaseInlineFormSet):
    '''
    Validate formset data here
    '''
    def clean(self):
        super(CompositionElementFormSet, self).clean()

        percent = 0
        for form in self.forms:
            if not hasattr(form, 'cleaned_data'):
                continue
            data = form.cleaned_data
            percent += data.get('percent', 0)

        if percent != 100:
            raise ValidationError(_('Total of elements must be 100%%. Current : %(percent).2f%%') % {'percent': percent})

class CompositionElementAdmin(admin.TabularInline):
    model = CompositionElement
    formset = CompositionElementFormSet

class CompositionAdmin(admin.ModelAdmin):
    inlines = (CompositionElementAdmin,)

admin.site.register(Composition, CompositionAdmin)
Run Code Online (Sandbox Code Playgroud)

  • 根据 [this answer](http://stackoverflow.com/a/14031135/25507),您应该检查 `form.cleaned_data['DELETED']` 以及 `not form.cleaned_data`。 (2认同)