首页 > 解决方案 > Django - 如何只返回表单验证消息而不是表单本身?

问题描述

在 Django 学习项目中,我只想将自定义验证消息作为列表或元组返回。但是我在网上找到的几乎所有教程都使用了 Form 类,几乎类似于以下代码:

def save(request):
    if request.method == "POST":
        form = RegistrationForm( request.POST )
        if form.is_valid():
            # save employee
            return redirect('index')
    else:
        form = RegistrationForm()

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

其中RegistrationForm包含以下代码:

from django import forms

class RegistrationForm(forms.Form):
first_name = forms.CharField(min_length=4)
last_name = forms.CharField(required=False)
email = forms.EmailField()
contact_no = forms.CharField(min_length=11)
gender = forms.CharField(min_length=4)

此验证有效,它返回包含所有验证消息的表单。但我想要的是:我想返回验证消息,而不是表单本身。我在 Django 中很新,所以我想不出一种合适的方式(如果有的话)如何将验证消息作为列表或元组返回,而不是作为表单对象。

任何人都可以帮助解决这个问题吗?

标签: pythonpython-3.xdjango

解决方案


这是使用自定义表单验证错误的示例

首先创建你的模型

模型.py:

from django.db import models

class RegistrationModel(models.Model):
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    phone_number = models.IntegerField(max_digits=11)

表格.py:

from django import forms

class RegistrationModelForm(forms.ModelForm):
    class Meta:
        model = RegistrationModel
        fields = ('first_name', 'last_name', 'phone_number')
        widgets = {
            'first_name': forms.TextInput(attrs={'placeholder': 'first name'}),
            'last_name': forms.TextInput(attrs={'placeholder': 'last name'}),
            'phone_number': forms.TextInput(attrs={'placeholder': 'phone number'}),
        }

    def clean(self):
        super(RegistrationModelForm, self).clean()
        first_name = self.cleaned_data.get('first_name')
        last_name = self.cleaned_data.get('last_name')
        phone_number = self.cleaned_data.get('phone_number')
        if len(first_name) < 10:
            self._errors['first_name'] = self.error_class(
                ['first name must be 10 characters at least'])
        if len(last_name) < 10:
            self._errors['last_name'] = self.error_class(
                ['last name must be 10 characters at least'])
        if len(phone_number) < 11:
            self._errors['phone_number'] = self.error_class(
                ['phone number must be 11 digits at least'])
        return self.cleaned_data

终于在你看来

视图.py:

from django.contrib import messages


if RegistrationModelForm.is_valid():
    # do something
else:
    messages.warning(request, form.errors)

推荐阅读