Django:强制管理员用户在TabularInline中输入至少一个项目

Ram*_*hum 8 django admin

在我的对象管理员中,Chair我有一个TabularInline任意数量的Desk对象.我希望每个Chair人都至少有一个Desk与之相关的对象.有没有办法让管理界面强制用户输入至少一个Desk?如果没有Desk输入则显示错误?

Sup*_*key 16

使用akaihola的答案,这是一个更完整的例子:

将其添加到您的forms.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.')
Run Code Online (Sandbox Code Playgroud)

然后,在你的admin.py中:

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

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

admin.site.register(Chair, ChairAdmin)
Run Code Online (Sandbox Code Playgroud)


aka*_*ola 9

clean()需要至少一个项目的通用FormSet 方法:

    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.')
Run Code Online (Sandbox Code Playgroud)

这适用于普通表格集,模型表格集和内联模型表单集.


Bra*_*don 0

Matthew Flanagan 有一个很好的示例,说明如何在表单集中要求一个有效的表单:http://code.google.com/p/wadofstuff/wiki/WadOfStuffDjangoFormshttp://wadofstuff.blogspot.com/2009/08/requiring -at-least-one-inline-formset.html 希望对您有所帮助。