Django: Forcing admin users to enter at least one item in TabularInline

后端 未结 3 1096
死守一世寂寞
死守一世寂寞 2021-02-04 13:36

In my admin for an object Chair I have a TabularInline for an arbitrary number of Desk objects. I want every Chair to always

相关标签:
3条回答
  • 2021-02-04 14:09

    Matthew Flanagan has a great example of how to require one valid form in a formset: http://code.google.com/p/wadofstuff/wiki/WadOfStuffDjangoForms and http://wadofstuff.blogspot.com/2009/08/requiring-at-least-one-inline-formset.html Hope that helps you out.

    0 讨论(0)
  • 2021-02-04 14:14

    A generic FormSet clean() method for requiring at least one item:

        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.')
    

    This should work for plain formsets, model formsets and in-line model formsets.

    0 讨论(0)
  • 2021-02-04 14:34

    Using akaihola's answer, here is a more complete example:

    Add this to your 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.')
    

    And then, in your admin.py:

    class DeskInline(admin.TabularInline):
        model = Desk
        formset = AtLeastOneRequiredInlineFormSet
    
    class ChairAdmin(admin.ModelAdmin):
        inlines = [DeskInline,]
    
    admin.site.register(Chair, ChairAdmin)
    
    0 讨论(0)
提交回复
热议问题