Добавление пользовательской проверки в форму отображения списка
У меня есть модель, в которой есть опция для установки, активен ли элемент или нет.
Существует ограничение на количество элементов, которые могут иметь свойство "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 ответ:
Хороший вопрос! Форма списка изменений, по-видимому, извлекается из
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)