【问题标题】:Django: Forcing admin users to enter at least one item in TabularInlineDjango:强制管理员用户在 TabularInline 中输入至少一项
【发布时间】:2011-08-04 15:34:39
【问题描述】:

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

【问题讨论】:

    标签: django admin


    【解决方案1】:

    使用 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)
    

    【讨论】:

      【解决方案2】:

      需要至少一项的通用 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.')
      

      这应该适用于普通表单集、模型表单集和内嵌模型表单集。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-29
        • 2018-07-23
        • 2020-02-18
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        相关资源
        最近更新 更多