欢迎访问宙启技术站
智能推送

Python中NON_FIELD_ERRORS_KEY的解释和使用示例

发布时间:2023-12-31 18:27:10

在Python中,Django框架中定义了一个名为NON_FIELD_ERRORS_KEY的常量,它用于表示表单错误中不属于任何特定字段的错误。

NON_FIELD_ERRORS_KEY常量是一个字符串,其默认值为'__all__'。当表单校验失败时,如果存在不属于任何字段的错误,这些错误将会被放置在表单的errors属性中,其中键为NON_FIELD_ERRORS_KEY,值为一个字符串列表,表示所有的非字段错误。

以下是一个使用NON_FIELD_ERRORS_KEY的示例:

from django import forms

class MyForm(forms.Form):
    name = forms.CharField(label='Name')
    age = forms.IntegerField(label='Age')

    def clean(self):
        cleaned_data = super().clean()
        name = cleaned_data.get('name')
        age = cleaned_data.get('age')

        if name and name.lower() != 'john' and age and age >= 18:
            # 如果名称不是'john'且年龄大于等于18,则抛出一个不属于特定字段的错误
            raise forms.ValidationError("You are not eligible")

        return cleaned_data

在上面的示例中,我们定义了一个表单类MyForm,它包含nameage两个字段。我们覆写了clean方法,在该方法中对表单数据进行了校验。如果名称不是'john'且年龄大于等于18,则抛出了一个表单错误。

现在,让我们在视图函数中使用这个表单,并处理表单的错误:

from django.shortcuts import render
from .forms import MyForm

def my_view(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            pass
    else:
        form = MyForm()

    context = {
        'form': form
    }
    return render(request, 'my_template.html', context)

在上述视图函数中,我们首先通过POST请求创建了一个MyForm实例,并使用is_valid方法进行表单校验。如果表单校验成功,我们可以处理表单的数据。如果校验失败,我们可以直接从表单对象的errors属性中获取非字段错误,并在模板中显示给用户。

在模板文件my_template.html中,我们可以将非字段错误显示给用户:

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  {% if form.errors %}
    <ul class="errorlist">
      {% for error in form.errors[NON_FIELD_ERRORS_KEY] %}
        <li>{{ error }}</li>
      {% endfor %}
    </ul>
  {% endif %}
  <input type="submit" value="Submit">
</form>

在上面的模板中,我们首先使用form.as_p渲染表单的字段并添加CSRF令牌,然后判断表单是否有错误。如果有错误,我们通过循环遍历form.errors[NON_FIELD_ERRORS_KEY]来显示非字段错误。

总结:

NON_FIELD_ERRORS_KEY常量用于表示Django表单中不属于任何特定字段的错误。我们可以使用它来获取并处理表单校验失败时的非字段错误,并在模板中显示给用户。