Добавление пользовательской проверки в форму отображения списка


У меня есть модель, в которой есть опция для установки, активен ли элемент или нет.

Существует ограничение на количество элементов, которые могут иметь свойство "active" со значением "True".

Я написал код проверки на AdminModel. Так что теперь, если при редактировании элемента я отмечаю его как " активный "и достиг предела элементов" actvie", я создаю исключение.

def clean_active(self):
  if self.cleaned_data["active"]:
       #check number of active elements in model.

В интерфейсе администратора у меня также есть список объектов. В этом списке я отметил как редактируемое поле " активный", list_display = ('имя', 'first_promotion', 'second_promotion','активный') readonly_fields= ['имя'] list_editable= ['active']

Что я хочу, так это иметь возможность также сделать эту проверку на "дисплее списка" модели. Я не могу, где я должен добавить код проверки для отображения списка.

Может ли кто-нибудь показать мне, как это делается? Заранее спасибо.
1 4

1 ответ:

Хороший вопрос! Форма списка изменений, по-видимому, извлекается из ModelAdmin.get_changelist_form, где вы можете предоставить свою собственную ModelForm, чтобы служить базовой моделью modelformset.

class MyForm(forms.ModelForm):
    def clean_active(self):
        cd = self.cleaned_data.get('active')
        limit = 5 # replace with logic
        if cd >= limit:
            raise forms.ValidationError("Reached limit")
        return cd

    class Meta:
        model = MyModel

class MyModelAdmin(admin.ModelAdmin):
    def get_changelist_form(self, request, **kwargs):
        return MyForm

Если вы хотите изменить проверку наборов форм (коллекцию форм), вы должны переопределить get_changelist_formset

from django.forms.models import BaseModelFormSet

class BaseFormSet(BaseModelFormSet):
    def clean(self):
        print self.cleaned_data 
        # this is the cleaned data for ALL forms.
        if 'your_condition': 
            raise forms.ValidationError("Your error")

        return self.cleaned_data

class MyModelAdmin(admin.ModelAdmin):
    def get_changelist_formset(self, request, **kwargs):
        kwargs['formset'] = BaseFormSet
        return super(MyModelAdmin, self).get_changelist_formset(request, **kwargs)