【问题标题】:How to validate forms using django and how many ways to validate form using django如何使用 django 验证表单以及使用 django 验证表单的方法有多少
【发布时间】:2023-03-12 13:49:01
【问题描述】:

我尝试了很多方法来使用 Django 验证表单。但它无法验证 Django 表单我看到很多文档和许多视频来实现表单验证。但它不会工作。任何人都可以提供解决方案。
1. 使用 Django 处理表单验证有几种方法?
2. 使用 Django 处理表单验证的最佳方式是什么?

我尝试过这种方式来处理验证错误。但它不能工作

我的代码

forms.py


from django.core.validators import validate_slug,validate_email
from django import forms
from .validators import validatenames

class validform(forms.Form):
    firstname = forms.CharField(max_length=10)
    class Meta:
        fields = ['firstname']

    def clean_firstname(self):
        name = self.cleaned_data.get('firstname')
        name_req = 'hari'  
        if not name_req in name:
            raise forms.ValidationError("Not a name")
        return name

views.py

from django.shortcuts import render
from .forms import validform

# Create your views here.
def index(request):
    form = validform()
    return render(request,'index.html',{'form':form})

index.html

<form>
    {{ form.as_p }}
    <input type="submit" value="submit">
</form>

我尝试了另一种方法来处理验证错误。这也行不通

我的代码

forms.py


from django.core.validators import validate_slug,validate_email
from django import forms
from .validators import validatenames

class validform(forms.Form):
    firstname = forms.CharField((validators=[validatenames]))
    class Meta:
        fields = ['firstname']

views.py

from django.shortcuts import render
from .forms import validform

# Create your views here.
def index(request):
    form = validform()
    return render(request,'index.html',{'form':form})

index.html

<form>
    {{ form.as_p }}
    <input type="submit" value="submit">
</form>

validators.py


from django.core.exceptions import ValidationError  

def validatenames(value):
    if not 'hari' in value:
        raise ValidationError("Not a name")
    return value

我不知道哪里出错了

【问题讨论】:

  • 你需要调用表单的is_valid()方法。所以你可以这样称呼它if form.is_valid(): # some processing
  • 但我需要在 HTML 中添加单个字段验证。一旦我在字段中输入错误的数据,它的自动抛出字段是无效错误这种情况如何实现
  • 要明确一点:所以您正在寻找一种在提交表单之前验证 html 表单中的字段的方法?类似于例如如果用户在该输入中输入非数字,则不允许提交表单的数字输入?
  • 是的,如何验证
  • @Chris 是的,如何使用 Django 实现表单验证

标签: django django-models django-forms django-templates django-views


【解决方案1】:

Django 可以为您处理服务器端验证。您在上面发布的两个示例是执行此操作的两种有效方法,它们几乎是正确的。您只需要将一些数据传递给您的表单进行验证。因此,如果您将视图更改为

# Create your views here.
def index(request):
    form = validform(request.GET or None)
    return render(request,'index.html',{'form':form})

如果用户在输入中输入的不是“hari”,它将在您的 html 页面中显示错误。

服务器端意味着您的数据被发送到服务器并在那里验证,返回错误消息或在数据无效的情况下。

当我们谈论客户端验证时,这是由客户端(即用户的浏览器)在数据发送到服务器之前完成的。这不是由 django 处理的。为此,您可以使用内置的 html5 验证或 javascript 来编写自定义验证方法。内置 html5 验证的示例是 number input:如果用户在此类字段中输入字母并尝试提交表单,则会出现一个气泡,告诉用户他应该输入一个有效数字。内置验证更容易使用,因为它不需要任何 javascript 但确实有限制,例如你不能定义你自己的错误信息。

要通过客户端验证在您的帖子中实现验证,您可以使用输入的“模式”属性。该模式是用于验证的正则表达式。例如

<input type="text" pattern="/hari/">

如果用户尝试提交不包含“hari”作为名字的表单,则会在浏览器中显示一个气泡,说明输入不是有效的模式。

您可以在创建表单时添加此属性,例如通过覆盖表单的__init__ 方法:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['firstname'].widget.attrs.update({'pattern': '/hari/'})

如果您想要自定义消息等,您需要编写 javascript。

您可以看到客户端验证是一个相当广泛的主题,也许您想阅读一些关于此的文档,例如 these,也包含示例。

最后一句话:客户端验证和服务器端验证不是一个或另一个的问题。您应该始终使用服务器端验证,因为它更可靠。客户端验证是改善用户体验的额外好处,但绝不应该是唯一的验证方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2011-03-10
    • 2011-01-19
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多