首页 > 解决方案 > 将表单集中的字段添加到 add_error

问题描述

我在 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 字段。如果我通过'ticket_id',将发生此错误:

'TimesheetForm' has no field named 'ticket_id'.

没错,因为 ticket_id 不在 Timesheet 表单中,但它在 ActionForm 中,这是 Timesheet 表单中的一个表单集。

我应该将什么传递给 add_error 以指示此字段?

标签: pythondjangodjango-viewsdjango-admin

解决方案


查看add_error文档,该方法接受两个参数:

Form.add_error(field, error)

field 参数是应添加错误的字段的名称。如果其值为 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')

推荐阅读