Как сгенерировать ValidationError для DjangoAdmin, если это ModelAdmin с change_view

у меня есть модель

class Group(models.Model):
    active = models.BooleanField(null=False, blank=False, default=True)

и его административные страницы

class GroupAdmin(admin.ModelAdmin):
    change_form_template = "admin/group/group.html"
    form = GroupAdminForm

    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context['group_data'] = self.get_info(object_id)
        return super(GroupAdmin, self).change_view(
            request, object_id, form_url, extra_context=extra_context,
        )

class GroupAdminForm(ModelForm):
    class Meta:
        model = Group
        fields = '__all__'

    def clean_active(self):
        active = self.cleaned_data['active']

        if 'active' in self.changed_data and not active and OtherCondition:
            raise ValidationError('Group must stay active because of OtherCondition')
        return active

для которого требуется шаблон change_view.

Из-за шаблона change_view ошибки проверки не отображаются.

Как мне выдать ошибку проверки и отобразить ее в админке Django? Есть ли способ сделать это с помощью ValidationError? Это путем изменения шаблона change_view?

  • Когда я бросаю его в Group.save() в модели, он ломает страницу вместо того, чтобы не сохранять и сообщать пользователю об исправлении ошибки.
  • Сначала я не использовал форму AdminForm, но ее использование означает, что проверка запущена, и она запрашивает изменение (Пожалуйста, исправьте ошибку ниже.), но не показывает сообщение ValidationError.

Этот вопрос похож, но рекомендует сообщения, но я хотел бы знать, есть ли другой способ: Поднять ошибку проверки администратора django из пользовательского представления


Я не думаю, что специально включаю ошибки полей, но я думаю, что их следует включать через предоставленный django html:

admin/change_form имеет

{% block field_sets %}
{% for fieldset in adminform %}
  {% include "admin/includes/fieldset.html" %}
{% endfor %}
{% endblock %}

и admin/includes/fieldset .html содержит {{ line.errors }}. Может быть, это связано с передачей ошибки в change_view?


group.html по запросу.

{% extends "admin/change_form.html" %}
{%  block field_sets %}
    {# stuff #}
    {{ block.super }}
{%  endblock %}

{% block inline_field_sets %}
{% for inline_admin_formset in inline_admin_formsets %}
    {# stuff #}
{% endfor %}
{% endblock %}

{# M2M Preview #}
{% block after_related_objects %}
    {# stuff #}
{%  endblock %}


person ehacinom    schedule 26.03.2018    source источник
comment
Можете ли вы добавить сюда group.html (или хотя бы рендеринг формы)? Если вы визуализируете вручную, включаете ли вы ошибки поля?   -  person Paulo Almeida    schedule 26.03.2018
comment
Вы не включаете ошибки поля, но, насколько я могу судить (я не знаком с этой формой), вы также не обрабатываете форму вручную, так что это не должно быть проблемой. Вы можете попробовать добавить ошибку вручную в определенное поле или как non_field_error с полем None, просто чтобы посмотреть, работает ли это.   -  person Paulo Almeida    schedule 26.03.2018
comment
@PauloAlmeida Думаю, вы правы, это не должно быть проблемой, но я попробую добавить его вручную!   -  person ehacinom    schedule 26.03.2018
comment
это не исправить   -  person ehacinom    schedule 26.03.2018
comment
Единственное, что мне приходит в голову, это использовать отладчик и посмотреть, какое значение имеет line в шаблоне и других связанных переменных.   -  person Paulo Almeida    schedule 26.03.2018


Ответы (1)


Я думаю, что проверка формы - хорошая идея в таких ситуациях.

forms.py

class YourForm(forms.ModelForm):

    def clean(self):
        super(YourForm, self).clean()
        data1 = self.cleaned_data.get('data1')
        data2 = self.cleaned_data.get('data2')

        # Add validation condition here
        # if validation error happened you can raise the error 
        # and attach the error message with the field you want.

        self.add_error('field_name', 'error message')

В admin.py

 class YourAdminClass(admin.ModelAdmin):
     form = YourForm
person Nitheesh MN    schedule 09.04.2018