2018-06-21-django-12form表单

本文深入探讨Django框架中的表单应用,介绍如何创建及验证表单数据,涵盖字段定义、参数设置、错误消息定制等内容,同时提供登录注册实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Djangoform表单

django中的表单不是html中的那个表单.这个表单是用来验证数据的合法性的一个东西,也可以生成HTML代码.

使用表单
  1. 创建一个forms.py的文件,放在指定的app当中,然后在里面写表单.
  2. 表单是通过类实现的,继承自forms.Form,然后在里面定义要验证的字段.
  3. 在表单中,创建字段跟模型是一模一样的,但是没有null=True或者blank=True等这几种参数了,有的参数是required=True/False.
  4. 使用is_valid()方法可以验证用户提交的数据是否合法,而且HTML表单元素的name必须和django中的表单的name保持一致,否则匹配不到.
  5. is_bound属性:用来表示form是否绑定了数据,如果绑定了,则返回True,否则返回False.
  6. cleaned_data:这个是在is_valid()返回True的时候,保存用户提交上来的数据.
  7. 一定要特别注意:is_vaild()方法验证过,必须html表单元素name要与forms.py类的name要一致
  8. 还有,cleaned_data这个属性,必须是在is_vaild()方法验证成功后,才有
字段类型中的一些参数

这些参数会对页面的输入做一些限制条件:

max_length  最大长度
min_length  最小长度
widget  负责渲染网页上HTML 表单的输入元素和提取提交的原始数据
attrs  包含渲染后的Widget 将要设置的HTML 属性
error_messages 报错信息
登录注册案例
—views.py—
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
from .forms import AddForm,RegisterForm,LoginForm
import json
from .models import (UserModel)
# Create your views here.
from django.contrib.auth.models import User, Permission, Group
from django.contrib.auth import authenticate,login,logout

def add(request):
    """01利用form创建前端代码和校验"""
    if request.method == 'GET':
        form = AddForm()
        return render(request,'add_form.html',{"form":form})
    elif request.method =='POST':
        form = AddForm(request.POST)    #拿到form提交的数据
        if form.is_valid():
            print(form.cleaned_data)    #{'second': 3, 'first': 2}
            #字典获取值的方法,两种[]和get
            first = form.cleaned_data['first']
            second = form.cleaned_data.get('second')

            return HttpResponse(str(int(first)+int(second)))


def register(request):
    """03注册"""
    if request.method == 'GET':
        form = RegisterForm()
        return render(request,'register.html',{'form':form})
    elif request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            password_repeat = form.cleaned_data.get('password_repeat')
            email = form.cleaned_data.get('email')
            if password == password_repeat:
                # user = UserModel()
                # user.username = username
                # user.password = password
                # user.email = email
                # user.save()
                #不用自己创建的UserModel了,直接使用auth里面的User模型
                User.objects.create_user(username=username,password=password,email=email)
                return HttpResponse("注册成功")
            # data = {
            #     'username':username,
            #     'password':password,
            #     'password_repeat':password_repeat,
            #     'email':email
            # }
            # return HttpResponse(json.dumps(data))
        else:
            return HttpResponse('注册失败')


def login_aps(request):
    """04登录"""
    if request.method == 'GET':
        return render(request,'login22.html')
    elif request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            # user = UserModel.objects.filter(username=username,password=password)

            #使用auth自带的authenticate自带的方法验证
            user = authenticate(username=username,password=password)
            if user:
                # request.session['username']=username
                #使用auth自带的login登录,
                # 会在客户端生成session_id;服务端的django_session表中生成session的内容
                login(request,user)
                nexturl = request.GET.get('next')
                print(nexturl)
                #/blog/
                if nexturl:
                    # return redirect(reverse('ts22_home'))
                    return redirect(nexturl)
                else:
                    return redirect(reverse('ts22_home'))
            else:
                return redirect(reverse('ts22_register'))
        else:
            return render(request,'login22.html',{'error':form.errors})


def home(request):
    """05home页面"""
    # a = int('xxxxx')
    #故意写错,来验证我们自定义的异常中间件
    # print(request.myuser)
    username = request.myuser
    #把request.user换成request.myuser来验证我们自定义的上下文
    # username = request.session.get('username','未登录')
    return render(request,'home22.html',{'username':username})


def logout_aps(request):
    """06 退出"""
    # request.session.flush()   #删除cookies的id,并且删除服务端session表的记录
    logout(request) #使用django auth系统自带的login,删除session_id并且session表记录
    return redirect(reverse('ts22_home'))

#-----------------------------------------------------
#现在用系统自带的User


def test(request):
    """07 多个交互的操作"""
    # User.objects.create_user(username='xiaoming',password='qwe123',email='43992163.com')
    #为普通用户kakaxi添加可以add Blogmodel的权限
    # kakaxi = User.objects.filter(username='kakaxi').first()
    # print(kakaxi)
    # permission = Permission.objects.filter(codename='add_blog').first()
    # print(permission)
    #blog | blog | Can add blog
    # kakaxi.user_permissions.add(permission)
    # 组操作:
    # g1 = Group.objects.create(name='user_add_blog')
    # g1.save()
    #给组添加权限
    # g1 = Group.objects.filter(name='user_add_blog').first()
    # permission = Permission.objects.filter(codename='add_blog').first()
    # g1.permissions.add(permission)
    # g1.save()
    #把用户mingren1添加到group组里面,那么组员就具有了组的权限
    mingren1 = User.objects.filter(username='mingren1').first()
    g1 = Group.objects.filter(name='user_add_blog').first()
    g1.user_set.add(mingren1)
    return HttpResponse('添加数据成功')
—forms.py—
from django import forms


class AddForm(forms.Form):
    first = forms.IntegerField()
    second = forms.IntegerField()


class RegisterForm(forms.Form):
    username = forms.CharField(max_length=8,min_length=6)
    password = forms.CharField(max_length=8,min_length=6,
                               widget=forms.PasswordInput(
                                   attrs={"placeholder":"请输入密码"}),
                               error_messages={'min_length':'密码长度不能小于6',
                                               'max_length':'密码长度不能超过8'})
    password_repeat = forms.CharField(max_length=8,
                                      widget=forms.PasswordInput(
                                          attrs={'placeholder':'请在输入密码'}),
                                      error_messages={'max_length':'密码长度小于6'})
    email = forms.EmailField()


class LoginForm(forms.Form):
    username = forms.CharField(label='用户名',max_length=8,
                               error_messages={'max_length':'不能超过8个字符'})
    password = forms.CharField(label='密码',max_length=8,min_length=6,
                               widget=forms.PasswordInput(
                                   attrs={'placeholder':'请输入密码'}
                               ))
—models.py—
from django.db import models

# Create your models here.


class UserModel(models.Model):
    username = models.CharField(max_length=30,unique=True)
    password = models.CharField(max_length=30)
    email = models.EmailField()
    def __str__(self):
        return self.username
-----urls.py-------
from django.conf.urls import url

from .views import (add,register,home,login_aps,logout_aps,test)

urlpatterns = [
    url(r'add/$',add,name='ts22_add'),
    url(r'home/$',home,name='ts22_home'),
    url(r'login/$',login_aps,name='ts22_login'),
    url(r'logout/$',logout_aps,name='ts22_logout'),
    url(r'register/$',register,name='ts22_register'),
    url(r'test/$',test,name='ts22_test'),
]
—home22.html—
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>home22</title>
</head>
<body>
欢迎  {{ username }} (中间件添加的用户登录信息)<br>
欢迎  {{ myuser }} (自定义上下文中添加的用户登录信息)<br>
{#{{ request.path }}  添加了上下文是可以直接访问到的#}
<a href="{% url 'ts22_login' %}">登录</a>
<a href="{% url 'ts22_register' %}">注册</a>
<a href="{% url 'ts22_logout' %}">退出</a>
<p><a href="{% url 'blog_index' %}">进入博客主页</a></p>
</body>
</html>
—register.html—

这个对应上面的register.html中的{{ from.as_p }},

我是在页面审查元素,复制过来的

<form action="" method="post">
    <input type="hidden" name="csrfmiddlewaretoken"
           value="7nqwuQVc6e91XUZav8jnPgc5c9ovbuZ8DdXBeVrcJxZPTlDDL25aIU6cIDwdHk3f">
    <p><label for="id_username">Username:</label> <input type="text" name="username" maxlength="8" minlength="6"
                                                         id="id_username" required=""></p>
    <p><label for="id_password">Password:</label> <input type="password" name="password" maxlength="8" minlength="6"
                                                         id="id_password" placeholder="请输入密码" required=""></p>
    <p><label for="id_password_repeat">Password repeat:</label> <input type="password" name="password_repeat"
                                                                       maxlength="8" id="id_password_repeat"
                                                                       placeholder="请在输入密码" required=""></p>
    <p><label for="id_email">Email:</label> <input type="email" name="email" id="id_email" required=""></p>
    <input type="submit" value="注册">
</form>
—login22.html—
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login22</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    用户名: <input type="text" name="username"> <br>
    密码: <input type="password" name="password"> <br>
    <input type="submit" value="登录">
    {{ error }}
</form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值