Добавление поля из набора форм в add_error - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий код в admin.py:

from django.contrib import admin
from .models import Timesheet
from .models import Action
import requests


class ActionAdmin(admin.TabularInline):
    model = Action
    extra = 0


class TimesheetAdmin(admin.ModelAdmin):
    inlines = [ActionAdmin]

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            url = 'https://xxx.xxxxxx.com/api.php'
            contents = requests.get(url)

            if contents.status_code == 200 and contents.json()['result'] == 'success':
                instance.ticket_title = contents.json()['subject']
                instance.save()
            else:
                form.add_error('?????', 'Ticket ID Not Found')
        formset.save_m2m()


admin.site.register(Timesheet, TimesheetAdmin)

У меня есть поле ticket_id в formset.Если я передаю 'ticket_id', эта ошибка произойдет:

'TimesheetForm' has no field named 'ticket_id'.

Это верно, потому что ticket_id не в форме расписания, но в ActionForm, которая является формой набора в форме расписания.

Что я должен передать add_error для указания этого поля?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Посмотрев документы add_error , метод принимает два параметра:

Form.add_error(field, error)

Аргумент поля - это имя поля, к которому следует добавить ошибки. Если его значение равно None, ошибка будет считаться ошибкой, не связанной с полем, как возвращено Form.non_field_errors ().

Аргументом ошибки может быть простая строка или, предпочтительно, экземпляр ValidationError. См. Повышение ValidationError для получения рекомендаций по определению ошибок формы.

В вашем случае вы должны использовать его как:

if contents.status_code == 200 and contents.json()['result'] == 'success':
  instance.ticket_title = contents.json()['subject']
  instance.save()
else:
  form.add_error('ticket_id', 'Ticket ID Not Found')
0 голосов
/ 11 мая 2018

Обновите вашу функцию save_formset, как показано ниже

def save_formset(self, request, form, formset, change):
    instances = formset.save(commit=False)
    for instance in instances:
        url = 'https://xxx.xxxxxx.com/api.php'
        contents = requests.get(url)

        if contents.status_code == 200 and contents.json()['result'] == 'success':
            instance.ticket_title = contents.json()['subject']
            instance.save()
        else:
            raise forms.ValidationError('?????', 'Ticket ID Not Found')
    formset.save_m2m()

Это может решить вашу проблему

...