2019.03.24 表单类

Form.form是一种内置的模板吧,它有自己设置的表单样式

可以引用它,但我觉得还是自己写会比较好吧

继承的是forms类了而不是models类了

然后就是表单得验证,也是用了内置得数据库叫做

authenticate,login就是存admin密码的那个

概述

表单既可以在模板页面利用HTML编写,也可以使用Django提供的表单类编写。

相关属性参考官网:https://docs.djangoproject.com/en/1.11/ref/forms/fields/

实现熟悉的用户登录功能

  1. 创建新应用account
  2. settings中添加应用
  3. 配置URL
  4. 在account应用中创建forms.py文件
  5. 编写views函数
  6. 创建模板页面
  7. 启动服务器运行程序

配置URL

from django.conf.urls import url, includefrom django.contrib import admin?urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^account/‘,include(‘account.urls‘,namespace=‘account‘,app_name=‘account‘))]??
#coding=utf-8??from django.conf.urls import urlimport views?urlpatterns=[    url(r‘^login/$‘,views.login_view,name=‘login‘)]?

?

编写表单类(account.forms.LoginForm)

#coding=utf-8??from django import forms?class LoginForm(forms.Form):    username = forms.CharField(label=u‘用户名‘)    password = forms.CharField(label=u‘密码‘,widget=forms.PasswordInput)???

配置视图函数

# -*- coding: utf-8 -*-from __future__ import unicode_literals?from django.http import HttpResponsefrom django.shortcuts import renderfrom .forms import LoginFormfrom django.contrib.auth import authenticate,login???# Create your views here.def login_view(request):    if request.method==‘GET‘:        login_form = LoginForm()        return render(request,‘login.html‘,{‘login_form‘:login_form})?    else:        login_form= LoginForm(request.POST)??        #校验表单数据是否合法        if login_form.is_valid():            #以字典形式返回合法数据            cd = login_form.cleaned_data            print cd            #检验用户输入的用户和密码是否正确            user = authenticate(username=cd[‘username‘],password=cd[‘password‘])            print user?            if user:                #实现用户登录,将用户信息保存到session中完成登录操作                login(request,user)                return HttpResponse(‘success‘)?        return HttpResponse(‘failed‘)?

配置模板页面(login.html)

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>?    <form action="" method="post">        {% csrf_token %}        {{ login_form.as_p }}?{#        {% for field in login_form %}#}{#            {{ field.label_tag }}{{ field }}#}{#            {{ field.errors }}#}{#        {% endfor %}#}?        <input type="submit" value="登录"/>    </form></body></html>?

应用场景

  1. 查询时表单类只需要继承于forms.Form。
  2. 增删改时表单类需要继承于forms.ModelForm。

学生注册案例

创建模型类

# -*- coding: utf-8 -*-from __future__ import unicode_literals?from django.db import models?# Create your models here.?class Clazz(models.Model):    cno = models.AutoField(primary_key=True)    cname = models.CharField(max_length=20)?    def __unicode__(self):        return u‘Clazz:%s‘%self.cname    ?class Stu(models.Model):    sno = models.AutoField(primary_key=True)    sname = models.CharField(max_length=30)    clazz = models.ForeignKey(Clazz,on_delete=models.CASCADE)?    def __unicode__(self):        return u‘Stu:%s,%s‘%(self.sno,self.sname)????

创建表单类(应用包下创建forms.py)

#coding=utf-8??from django import formsfrom .models import *?class Add_Clazz(forms.ModelForm):    class Meta:        model = Clazz        #元组形式        fields = (‘cname‘,)??class Add_Stu(forms.ModelForm):    class Meta:        model = Stu        fields = (‘sname‘,)?

配置URL

from django.conf.urls import url, includefrom django.contrib import admin?urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^student/‘, include(‘student.urls‘)),]??
#coding=utf-8??from django.conf.urls import urlimport views?urlpatterns=[    url(r‘^register/$‘,views.register)?]?

创建视图

# -*- coding: utf-8 -*-from __future__ import unicode_literals?from django.http import HttpResponsefrom django.shortcuts import renderfrom .forms import Add_Clazz,Add_Stu# Create your views here.?def register(request):    if request.method==‘POST‘:        ac = Add_Clazz(request.POST)        astu = Add_Stu(request.POST)?        if ac.is_valid()*astu.is_valid():            new_clazz = ac.save()            new_stu = astu.save(commit=False)            new_stu.clazz = new_clazz            new_stu.save()            return HttpResponse(‘successfully‘)        else:            return HttpResponse(‘sorry,you can not register.‘)    else:        ac = Add_Clazz()        astu = Add_Stu()        return render(request,‘register.html‘,{‘ac‘:ac,‘astu‘:astu})?

创建模板

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>??<form action="/student/register/" method="post">    {% csrf_token %}    <p>        <label for="{{ astu.sname.id_for_label }}">姓名:</label>{{ astu.sname }}    </p>    <p>        <label for="{{ ac.cname.id_for_label }}">班级:</label>{{ ac.cname }}    </p>    <p>        <input type="submit" value="注册" />    </p>?</form>?</body></html>?
  1. JS前端校验
  2. forms表单类自定义校验

表单类

#coding=utf-8??from django import formsfrom .models import *?class Add_Clazz(forms.ModelForm):    class Meta:        model = Clazz        fields = (‘cname‘,)??class Add_Stu(forms.ModelForm):    password = forms.CharField(max_length=30,widget=forms.PasswordInput)    password2 = forms.CharField(max_length=30,widget=forms.PasswordInput)??    class Meta:        model = Stu        fields = (‘sname‘,)?    def clean_password2(self):        cd = self.cleaned_data        if cd[‘password‘]!=cd[‘password2‘]:            self.errors[‘password2‘] = [‘密码不一致‘]?            # raise forms.ValidationError(‘密码不一致!‘)        return cd[‘password2‘]???

视图函数

# -*- coding: utf-8 -*-from __future__ import unicode_literals?from django.http import HttpResponsefrom django.shortcuts import renderfrom .forms import Add_Clazz,Add_Stufrom . models import *# Create your views here.?def register(request):    if request.method==‘POST‘:        ac = Add_Clazz(request.POST)        astu = Add_Stu(request.POST)???        if ac.is_valid()*astu.is_valid():            try:                new_clazz =  Clazz.objects.get(cname=ac.cleaned_data[‘cname‘])            except Clazz.DoesNotExist:                #保存数据到数据库                new_clazz = ac.save()            #保存数据对象不提交数据库            new_stu = astu.save(commit=False)            new_stu.clazz = new_clazz            new_stu.password = astu.clean_password2()            new_stu.save()            return HttpResponse(‘successfully‘)        else:            return render(request,‘register.html‘,{‘ac‘:ac,‘astu‘:astu})    else:        ac = Add_Clazz()        astu = Add_Stu()        return render(request,‘register.html‘,{‘ac‘:ac,‘astu‘:astu})?

模板页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<form action="/student/register/" method="post">
{% csrf_token %}
<p>
<label for="{{ astu.sname.id_for_label }}">姓名:</label>{{ astu.sname }}
</p>
<p>
<label for="{{ astu.password.id_for_label }}">密码:</label>{{ astu.password }}
</p>
<p>
<label for="{{ astu.password2.id_for_label }}">密码:</label>{{ astu.password2 }}<span style="color: red;">{{ astu.errors.password2.0 }}</span>
</p>
<p>
<label for="{{ ac.cname.id_for_label }}">班级:</label>{{ ac.cname }}
</p>
<p>
<input type="submit" value="注册" />
</p>

</form>

</body>
</html>

原文地址:https://www.cnblogs.com/Py-king/p/10590373.html

时间: 2024-10-09 21:49:45

2019.03.24 表单类的相关文章

bootstrap 表单类

bootstrap 表单类 表单美化 用法: 向父元素 <form role="form"></form>     添加 role="form" 把标签和控件放在   .form-control 类的div里面 向所有的文本元素   input  textarea   seclect   添加类   .form-control 三种表单布局类:  垂直表单(默认)    内联表单     水平表单 摘自菜鸟教程 默认表单<form ro

Form表单类组件与Map地图组件

笔记内容:Form表单类组件与Map地图组件 笔记日期:2018-02-04 form之switch组件 switch组件是一个开关选择器,wxml示例代码如下: <view class='container'> <view class='switch_text'>switch</view> <switch name='switch1' checked='true' /> <switch name='switch2' /> <switch

python框架-django中的表单类

一:表单类 一般我们在html中自己写的表单类似于下面的样子 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv=

0基础学习前段历程2 第一门需要掌握的前端技术HTML5+CSS3 html表单类

<!-- 表单类 --> <label>姓名</label> <input type="text"> 文本框 <input type="password"> 密码框 <input type="button" value="按钮"> <input type="radio" name="" id="&qu

Django的表单类

一.表单绑定状态:Django为继承自Form类的表单维护了一个绑定(bound)状态. 1.如果一个表单对象在实例化后被赋予过数据内容,则成该表单处于bound状态,只有处于bound状态的表单CIA具有表单数据验证的功能. 2.如果未被赋予过数据内容,则表单处于unbound状态,只有处于unbound状态的表单才能被赋予数据,是该表单变为bound状态. 注意:已经处于bound状态的表单不能在python代码中修改其数据,而只能有网页用户在页面中输入数据进行修改. 二.表单数据验证:Dj

(九)表单类

在这里使用Flask的插件Flask-WTF,每个Web 表单都由一个继承自Form 的类表示.这个类定义表单中的一组字段,每个字段都用对象表示.字段对象可附属一个或多个验证函数.验证函数用来验证用户提交的输入值是否符合要求. #下面的代码是一个简单的Web 表单,包含一个文本字段和一个提交按钮. from flask.ext.wtf import Form from wtforms import StringField, SubmitField from wtforms.validators 

Python 2019/7/24 面向对象概念 类和对象 对象初始化__init__ 绑定与非绑定

面向对象 (Object Oriented Programming,简称OOP) 1.什么是面向对象:面向对象编程是一种思想,它指导程序员如何编写出更好的程序.它的核心是对象,此时程序员从操作者变成了指挥者. 2.为什么使用面向对象编程:当今时代背景下,通常应用程序对扩展性和维护性要求都是非常高的,为什么?想想qq,微信,是不是不断的在添加新功能?,也就是说一款应用程序诞生后,都需要不断的更新维护. 3.面向对象优缺点: 优点:拓展性  灵活性 重用性     缺点: 程序的复杂度提高了   无

Java表单类双击提交

双击制御 有些时候一些操作会非常的耗费时间(Long Lived Operation),例如这个数据库的导出,表表生成等.有些时候程序的使用者看到很长时间服务器 没有反应,倾向于多次点击提交按钮.这样恰恰相反,由于重新使服务器运行相同的长时间操作,反而让反应时间更慢. 我们如何来制御这样的操作呢? 我们能不能在每个页面生成的时候,自动生成一个特殊的隐藏字段,这个隐藏字段具有唯一性.每次向服务器提交请求的时 候,服务器就记录下这个隐藏字段,当在看到有相同的特殊字段的内容提交时,服务器认为这是重复提

form表单类标签汇总

<form action="form_action.asp" method="get"> First name: <input type="text" id="fname" name="fname" placeholder="Bill"> password: <input type="password" name="lname&