【发布时间】:2011-08-04 15:34:39
【问题描述】:
在我的管理对象Chair 中,我有一个TabularInline 用于任意数量的Desk 对象。我希望每个Chair 始终至少有一个与之关联的Desk 对象。有没有办法让管理界面强制用户输入至少一个Desk?如果没有输入Desk 则显示错误?
【问题讨论】:
在我的管理对象Chair 中,我有一个TabularInline 用于任意数量的Desk 对象。我希望每个Chair 始终至少有一个与之关联的Desk 对象。有没有办法让管理界面强制用户输入至少一个Desk?如果没有输入Desk 则显示错误?
【问题讨论】:
使用 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.')
然后,在你的 admin.py 中:
class DeskInline(admin.TabularInline):
model = Desk
formset = AtLeastOneRequiredInlineFormSet
class ChairAdmin(admin.ModelAdmin):
inlines = [DeskInline,]
admin.site.register(Chair, ChairAdmin)
【讨论】:
需要至少一项的通用 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.')
这应该适用于普通表单集、模型表单集和内嵌模型表单集。
【讨论】:
Matthew Flanagan 有一个很好的例子来说明如何在表单集中要求一个有效的表单:http://code.google.com/p/wadofstuff/wiki/WadOfStuffDjangoForms 和 http://wadofstuff.blogspot.com/2009/08/requiring-at-least-one-inline-formset.html 希望对您有所帮助。
【讨论】: