Django Form -- 简单的示例

==========urls.py===========

from django.conf.urls import include, url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^login/', views.login),
]
  • 对用户表单数据做验证
==========views.py===========
from django.shortcuts import render
from django import forms

#创建表单验证类
class LoginForm(forms.Form):
    #username、email与前端页面表单name属性值一致,<input type="text" name="username" placeholder="用户名">
    username = forms.CharField(min_length=3, error_messages={"required": '用户名不能为空', 'min_length': '用户名长度不能小3'})
    email = forms.EmailField(error_messages={"required": '邮箱不能为空', 'invalid': '邮箱格式错误'})

def login(request):

    if request.method == 'POST':
        obj = LoginForm(request.POST)

        #is_valid()方法: 当表单所有字段都验证通过则返回True
        if obj.is_valid():
            # clean()方法: 获取通过了验证的表单值
            # value_dict的值:{'username': 'dong', 'email': 'dong@163.com'}
            value_dict = obj.clean()
        else:
            # 获取验证表单的错误值
            # obj.errors的值:<ul class="errorlist"><li>username<ul class="errorlist"><li>用户名不能为空</li></ul></li><li>email<ul class="errorlist"><li>邮箱不能为空</li></ul></li></ul>
            obj.errors

            # 获取username表单错误信息的字符串值
            # obj.errors['username'][0]的值:用户名不能为空
            # obj.errors['username'][0]
            for k, v in obj.errors.items():
               obj.errors[k][0]

            # obj.errors.as_json()的值:{"username": [{"message": "u7528u6237u540du4e0du80fdu4e3au7a7a", "code": "required"}], "email": [{"message": "u90aeu7bb1u4e0du80fdu4e3au7a7a", "code": "required"}]}
            obj.errors.as_json()

        return render(request, 'login.html', {'obj': obj})
    elif request.method == 'GET':
        return render(request, 'login.html')
  • 表单错误信息在前端的展示
==========login.html===========
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form action="/login/" method="POST">
    {% csrf_token %}
    <p>
        <input type="text" name="username" placeholder="用户名">
        <span>{{ obj.errors.username.0 }}</span>
    </p>

    <p>
        <input type="text" name="password" placeholder="密码">
    </p>
    <p>
        <input type="text" name="email" placeholder="邮箱">
        <span>{{ obj.errors.email.0 }}</span>
    </p>
    <p>
        <input type="submit" value="提交">
    </p>
</form>
</body>
</html>

页面显示效果:

  • 表单保留上一次提交的数据 -- 前端页面需要使用LoginForm类的对象生成输入框
==========login.html===========
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form action="/login/" method="POST">
    {% csrf_token %}
    <p>
        {{ obj.username }}
        <span>{{ obj.errors.username.0 }}</span>
    </p>

    <p>
        <input type="text" name="password" placeholder="密码">
    </p>
    <p>
        {{ obj.email }}
        <span>{{ obj.errors.email.0 }}</span>
    </p>
    <p>
        <input type="submit" value="提交">
    </p>
</form>
</body>
</html>
==========views.py===========
from django.shortcuts import render
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(min_length=3, error_messages={"required": '用户名不能为空', 'min_length': '用户名长度不能小3'})
    email = forms.EmailField(error_messages={"required": '邮箱不能为空', 'invalid': '邮箱格式错误'})

def login(request):

    if request.method == 'POST':
        print('POST')
        obj = LoginForm(request.POST)

        if obj.is_valid():

            value_dict = obj.clean()
        else:

            obj.errors

            for k, v in obj.errors.items():
                obj.errors[k][0]

            obj.errors.as_json()

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

    elif request.method == 'GET':
        # 向前端传递LoginForm类对象
        obj = LoginForm()
        return render(request, 'login.html', {'obj': obj})

 前端页面展示效果

原文地址:https://www.cnblogs.com/dongmengze/p/9782723.html