zoukankan      html  css  js  c++  java
  • 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})
    

     前端页面展示效果

  • 相关阅读:
    读Android之大话设计模式--前言和说明
    把二叉树打印成多行
    按之字形顺序打印二叉树
    对称的二叉树
    二叉树的下一个结点
    链表中环的入口结点
    字符流中第一个不重复的字符
    表示数值的字符串
    构建乘积数组
    数组中重复的数字
  • 原文地址:https://www.cnblogs.com/dongmengze/p/9782723.html
Copyright © 2011-2022 走看看