Django: принуждение пользователей-администраторов ввести хотя бы один элемент в TabularInline - PullRequest
8 голосов
/ 13 апреля 2011

У моего администратора для объекта Chair У меня есть TabularInline для произвольного числа Desk объектов. Я хочу, чтобы с каждым Chair всегда был связан хотя бы один Desk объект. Есть ли способ заставить интерфейс администратора заставить пользователя ввести хотя бы один Desk? Как показать ошибку, если не введено Desk?

Ответы [ 3 ]

16 голосов
/ 26 февраля 2013

Используя ответ Акайхолы, вот более полный пример:

Добавьте это к форме .py:

from django import forms
from django.forms.models import BaseInlineFormSet

class AtLeastOneRequiredInlineFormSet(BaseInlineFormSet):

    def clean(self):
        """Check that at least one service has been entered."""
        super(AtLeastOneRequiredInlineFormSet, self).clean()
        if any(self.errors):
            return
        if not any(cleaned_data and not cleaned_data.get('DELETE', False)
            for cleaned_data in self.cleaned_data):
            raise forms.ValidationError('At least one item required.')

А потом, в вашем admin.py:

class DeskInline(admin.TabularInline):
    model = Desk
    formset = AtLeastOneRequiredInlineFormSet

class ChairAdmin(admin.ModelAdmin):
    inlines = [DeskInline,]

admin.site.register(Chair, ChairAdmin)
9 голосов
/ 27 августа 2012

Универсальный метод FormSet clean() для запроса хотя бы одного элемента:

    def clean(self):
        """Check that at least one service has been entered."""
        super(MyFormSet, self).clean()
        if any(self.errors):
            return
        if not any(cleaned_data and not cleaned_data.get('DELETE', False)
                   for cleaned_data in self.cleaned_data):
            raise forms.ValidationError('At least one item required.')

Это должно работать для простых наборов форм, наборов моделей для моделей и встроенных наборов моделей.

0 голосов
/ 13 апреля 2011

У Мэтью Фланагана есть отличный пример того, как требовать одну действительную форму в наборе форм: http://code.google.com/p/wadofstuff/wiki/WadOfStuffDjangoForms и http://wadofstuff.blogspot.com/2009/08/requiring-at-least-one-inline-formset.html Надеюсь, это поможет вам.

...