Проверка администратором Django для встроенной формы, которая полагается на общее поле между всеми формами - PullRequest
16 голосов
/ 19 января 2011

Простите, если на этот вопрос уже был дан ответ, я не смог найти ответ, в котором валидация зависела от совокупности встроенных форм.

Немного предыстории: я делаю сайт для страхового брокера, у которого есть «Полисы» и «Общая комиссия» этого полиса. Есть также «Торговые посредники», которые добавляются в «Политику» вместе с комиссией, которая им выплачивается (может иметь любое количество торговых посредников). Общая комиссия между торговыми посредниками должна быть меньше общей комиссии.

У меня есть admin.ModelForm для политики, и ниже у меня есть admin.InlineTabular, который может иметь несколько реселлеров через кнопку «Добавить», и все это прекрасно работает.

Однако я не могу понять, как выполнить проверку для них, чтобы я мог сложить все комиссии, а затем, если она больше, чем общая комиссия, выдать ошибку ValidationError.

Я пробовал clean (), но не знаю, как получить доступ к очищенным данным InlineTabular, если они вообще доступны!

Заранее спасибо за любую помощь!

Томас

1 Ответ

25 голосов
/ 14 июня 2011

Я знаю, что вопрос задавался давным-давно, но, поскольку я боролся с той же проблемой, я думаю, что это может быть полезно.

Ключевым моментом здесь является определение пользовательского набора форм для встраивания в табличную административную форму, а затем переопределение метода очистки набора форм.

Вот пример: композиция состоит из состав_элементов, каждый состав_элемент имеет поле процента, и я хочу проверить, что общий процент равен 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)
...