1

Django admin の TabularInline フィールドを必須にする必要があります。続行するにはどうすればよいですか?これが私のコードです:

admin.py

class SchoolInline(TabularInline):
    model = School.labs.through
    extra = 1

class LaboratoryAdmin(ModelAdmin):
    inlines = [SchoolInline]

register(Lab, LaboratoryAdmin)

問題をかなり単純化しましたが、基本的にはそれだけです。その結果、すべての学校のドロップダウン リストが表示されます。問題は、このフィールドが必須ではないことですが、必須にしたいのです。これを最も簡単な方法で行うにはどうすればよいですか?

4

1 に答える 1

4

フォーム.py

# One form required
from django.core.exceptions import ValidationError
from django.forms.models import BaseInlineFormSet    

class AtLeastOneFormSet(BaseInlineFormSet):
    def clean(self):
        super(AtLeastOneFormSet, self).clean()
        non_empty_forms = 0
        for form in self:
            if form.cleaned_data:
                non_empty_forms += 1
        if non_empty_forms - len(self.deleted_forms) < 1:
            raise ValidationError("Please fill at least one form.")

フォーム.py

# First form not empty and can not be deleted
from django.forms.models import BaseInlineFormSet    

class RequiredInlineFormSet(BaseInlineFormSet):
    def _construct_form(self, i, **kwargs):
        form = super(RequiredInlineFormSet, self)._construct_form(i, **kwargs)
        if i < 1:
            form.empty_permitted = False
        return form

deleteここに示すように、ビューを変更して最初のフォームのボタンを 削除する必要もあります: https://docs.djangoproject.com/en/dev/topics/forms/formsets/#manually-rendered-can-delete-and-注文可能

admin.py

from django.contrib.admin import TabularInline

class SchoolInline(TabularInline):
    model = School.labs.through
    extra = 1
    formset = RequiredInlineFormSet # or AtLeastOneFormSet
于 2013-05-14T19:23:46.517 に答える