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

Django中怎么对表单进行处理

发布时间:2023-05-13 21:50:16

Django是一个流行的Python Web框架,它提供了强大的表单处理机制。在Django中表单是一个HTML表单的抽象表示,它包含了需要提交到服务器的数据。在本文中,我们将详细介绍Django中的表单处理。

1. 定义表单

首先,我们需要定义表单类。一个表单类是一个继承自Django提供的Form类或其子类的Python类。定义表单时,需要指定要包含的字段和它们的类型以及校验规则和错误信息等。以下是一个简单的表单类定义示例:

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(widget=forms.PasswordInput)

在上面的示例中,我们定义了一个名为LoginForm的表单类,它包含两个字段:usernamepasswordusername字段是一个长度不超过20个字符的字符型字段,password字段是一个密码字段,它使用PasswordInput小部件进行呈现。这样,表单中的密码就被隐藏为星号。

2. 渲染表单

接下来,我们需要在模板中使用表单。在Django中可以使用{{form}}模板标签将表单渲染到HTML页面上:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
</form>

在上面的HTML代码中,我们使用{{form.as_p}}方法将表单呈现为一个<p>标签包含的形式,并且通过{% csrf_token %}模板标签添加了一个csrf令牌。

3. 接收提交表单的数据

当用户提交表单时,数据将被发送到服务器。Django中的视图函数可以通过以下两种方式来处理表单数据:

3.1 处理表单数据 - GET请求

在GET请求中,表单数据将被作为查询字符串包含在URL中。视图函数可以通过request.GET属性获取表单数据。以下是一个示例视图函数:

from django.shortcuts import render

def login(request):
    if request.method == "GET":
        form = LoginForm()
        return render(request, "login.html", {"form":form})
    
    elif request.method == "POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            #验证用户名和密码
            ...

在以上代码中,当请求是GET请求时,我们创建了一个空的表单并将其传递给模板,这样模板可以呈现出表单。当请求是POST请求时,我们从request.POST获取表单数据并传递给表单类进行验证。如果表单验证通过,我们可以使用cleaned_data属性获取表单中的数据。

3.2 处理表单数据 - POST请求

在POST请求中,表单数据将被作为请求正文发送到服务器。视图函数可以通过request.POST属性获取表单数据。以下是一个示例视图函数:

from django.http import HttpResponse

def login(request):
    if request.method == "POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            #验证用户名和密码
            ...
            #返回HttpResponse
            return HttpResponse("Login Success!")
    else:
        form = LoginForm()
    return render(request, "login.html", {"form":form})

在以上代码中,当请求是POST请求时,我们从request.POST获取表单数据并传递给表单类进行验证。如果表单验证通过,我们可以使用cleaned_data属性获取表单中的数据。最后,我们返回一个HttpResponse来告诉用户登录成功。

4. 表单验证

表单验证是Django中一个非常重要的组成部分。它可以帮助我们确保数据的完整性,防止用户提交无效或意外的数据。Django提供了各种内置的字段类型和验证器,可以有效帮助我们完成表单验证。

4.1 内置字段类型

Django提供了多种内置字段类型,例如CharField、DateTimeField、IntegerField等。这些字段类型可以帮助我们轻松定义表单中的字段,并强制要求这些字段的值符合某些预定义的规则。

from django import forms
from django.core import validators

class MyForm(forms.Form):
    name = forms.CharField(max_length=20, required=True)
    email = forms.EmailField()
    age = forms.IntegerField(validators=[validators.MinValueValidator(0),validators.MaxValueValidator(150)])

在上面的代码中,我们定义了一个名为MyForm的表单类,它包含了三个字段:nameemailagename字段是一个长度不超过20个字符的必填字符型字段,email字段是一个必须符合电子邮件格式的字符型字段,age字段是一个整型字段,其值必须大于等于0且小于等于150。

4.2 预定义的验证器

除了内置的字段类型,Django还提供了许多预定义的验证器。这些验证器可以帮助我们验证表单中的数据是否符合某些规则。以下是一些预定义的验证器的示例:

from django import forms
from django.core import validators

class LoginForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(widget=forms.PasswordInput)
    
    def clean_username(self):
        username = self.cleaned_data.get("username")
        if "admin" not in username:
            raise forms.ValidationError("只有管理员可以登录!")
        return username
    
    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get("username")
        password = cleaned_data.get("password")
        
        if username == "admin" and password != "admin123":
            raise forms.ValidationError("密码错误!")

在以上代码中,我们定义了一个名为LoginForm的表单类,它包含了两个字段:usernamepassword。我们还定义了两个主动验证方法clean_usernameclean。这两个方法用于验证usernamepassword字段是否合法。

clean_username验证方法用于验证username字段是否包含字符串"admin"。如果不包含,我们会根据具体错误原因抛出一个forms.ValidationError异常。

clean验证方法用于验证usernamepassword字段是否一起出现在表单中,并且验证用户输入的密码是否与预期密码相同。如果验证不通过,我们将抛出一个forms.ValidationError异常,同时将异常消息显示给用户。

5. 错误信息处理

当表单数据验证失败时,Django将收集错误信息,并将其存储在表单对象中。在模板中,我们可以使用以下方法来显示错误信息:

{% for field in form %}
    {{field.label_tag}}
    {{field}}
    {% if field.errors %}
        <ul class="errorlist">
        {% for error in field.errors %}
            <li>{{ error }}</li>
        {% endfor %}
        </ul>
    {% endif %}
{% endfor %}

在默认情况下,Django将会为每个无效字段自动生成错误信息。错误信息将显示在字段下面的<ul>标签中。我们可以使用field.errors属性访问这些错误信息。

在以上模板代码中,我们首先使用for循环遍历表单中的每个字段。然后,我们使用field.label_tagfield标签来呈现字段的标签和其相应的表单字段。最后,我们检查field.errors是否存在错误信息,如果存在我们就使用for循环将错误信息展示给用户。

6. 渲染多个表单

在某些情况下,我们可能需要在同一页面中呈现多个表单。为了实现这一点,我们需要为每个