Django中的Form(二)
一、保存用户输入内容
如果用户输入一张表单提交后出现错误时,会出现重现填写的情况。我们可以把用户输入的信息保存下来,并返回到前台页面,这样用户就无需再次输入。
views.py
# coding:utf-8
from django.shortcuts import render, HttpResponse, redirect
from app01.forms import account as Account_Forms def login(request): obj = Account_Forms.UserInfo(request.POST) #将用户输入的内容添加到form的对象中
if request.method == 'POST':
return render(request, 'account/login.html', {'obj': obj}) #将用户输入的内容返回到前台页面
return render(request, 'account/login.html', {'obj': obj})
forms.py
from django import forms class UserInfo(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput())
html文件
{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> <form action="/login/" method="post">
<p>{{ obj.username }}</p>
<p>{{ obj.password }}</p>
<input type="submit" value="submit">
</form> {#<script type="text/javascript" src="{{ STATIC_URL }}/js/jquery-2.1.4.min.js">#}
<script type="text/javascript" src="{% static "js/jquery-2.1.4.min.js" %}"></script>
</body>
</html>
二、生成动态的select
form中可以再前端生成select,select一般会分为两类:1、内容不变的数据。 2、从数据库或者文件中提取的经常发生改变的数据。1的实现方法可以见django form (一)。
如果从数据库提取数据,内容为免会经常发生增删改的情况,如果在使用1的实现方法就很不现实,此时我们就需要一种可以实现动态select的方法了。
先来看一段代码,不理解也没关系:
form中的类:
# coding:utf-8
from django import forms
from app01 import models class ImportForm(forms.Form):
Host_List = (
(1, '物理机'),
(2, '虚拟机')
)
host_type = forms.IntegerField(widget=forms.Select(choices=Host_List))
hostname = forms.CharField() admin = forms.IntegerField(widget=forms.Select()) def __init__(self, *args, **kwargs):
super(ImportForm, self).__init__(*args, **kwargs) self.fields['admin'].widget.choices = models.Simp.objects.all().values_list('id', 'username')
上一段代码其实就已经实现了form中动态的select功能,下面展开的select就是从数据库中提取的数据:
实现的原理
我们要知道一个前提,django form中要实现select,所传得参数必须是一个元组类型的数据。
如果你想知道为什么,其中是怎么实现的,为什么使用1的实现方法就是不行,那就耐心的往下看原理!这一段不属于django的知识点,属于python面向对象的内容。
我们知道python的类中可以定义静态字段,静态字段在类中加载后,被放入到内存中,如果再次修改静态字段,内存中的数据就不会在改变。为什么呢?
因为静态字段是属于类的。
类中的静态字段会被加载放入到内存中,属于类里面的内容,在第一次运行程序的时候,
只加载了一次。而我们每一次创建类的对象时,默认会执行类下面的 __init__构造函数。
而静态字段属于类,不属于对象,所以之后的每一次访问时都不会再次加载类中的内容。
所以当我们修改文件中或者数据库中与静态字段有关联的数据内容后,
再次访问的时候,并不会修改内存中的数据。(除非我们把程序重启)
如何做?
通过类的继承关系我们知道,如果执行的方法在当前类下没有,就会自动去父类中查找,如果有就会执行。
我们可以在定义的form类下重定义__init__方法。
def __init__(self, *args, **kwargs):
super(ImportForm, self).__init__(*args, **kwargs) self.fields['admin'].widget.choices = models.Simp.objects.all().values_list('id', 'username')
第一句中的super:执行父类中的__init__方法
第二句这行代码什么意思呢,可以往父类中查找源码到底做了什么
查找父类中的__init__方法,可以看到self.fields = copy.deepcopy(self.base_fields),
这一句就是把form类下面的静态字段都深copy了一份放在了对象里。这样,我们只需要修改对象里面那份数据就可以了。而类下面的数据不需要改变。
self.fields的结果是一个字典,用['admin']就可以查找到在form类中定义的静态字段:admin = forms.IntegerField(widget=forms.Select(choices=Host_List))
通过.widget.choices的方法就可以修改静态字段中的参数了。
当前台页面再次访问时,就会拿到一份新的数据,生成了一个新元组,重新传到前端的html页面中。这样就实现了动态的select。
Django中的Form(二)的更多相关文章
- Django中的Form
Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from dj ...
- Django中的Form表单
Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...
- Django中的form组件
Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...
- 转 Django中的Form
https://www.cnblogs.com/chenchao1990/p/5284237.html Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 ...
- Django中模型(二)
Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...
- Django 中的Form表单认证
一.Form表单 1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签 1.2 创建表单类Form 1. 创建 ...
- django中的 form 表单操作
form组件 1. 能做什么事? 1. 能生成HTML代码 input框 2. 可以校验数据 3. 保留输入的数据 4. 有错误的提示 1. 定义 from django ...
- django中的Form和ModelForm中的问题
django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新 方法一:重写构造方法,在构造方法中重新去获取值 class UserForm(forms.Form): ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
- Django 中的Form、ModelForm
一.ModelForm 源码 class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass): pass def modelform_fact ...
随机推荐
- easyui中datagrid标题居中内容居左实现方式
easyui中的datagrid使用起来,确实还是挺轻巧方便,但是其中也有不少的问题,尤其遇到客户的一些特殊的需求时往往实现得不是很好.这个时候就需要我们自己动手来修改easyui的源码了.easyu ...
- CSS图片去色
.imgFilter { filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); ...
- apache2.4下载与安装
step1 下载apache 百度“apache下载”,找到官网链接,如下 2. 点进去后选择 Files for microsoft windows,如下 3. 前三个任选一个,这里我们选第一个,如 ...
- Ext.Date 方法
1.Ext.Date.add(date,interval,value); 提供执行基本日期运算的简便方法; date 日期对象, interval 一个有效的日期间隔枚举值, value 向当前日期上 ...
- Model Thinking1
Why Model Reason # 1: Intelligent Citizen of the World Reason # 2: Clearer Thinker Reason # 3: Under ...
- 关于Kingfisher--备用
序言--感谢好心大神分享 Kingfisher 是由 @onevcat 编写的用于下载和缓存网络图片的轻量级Swift工具库,其中涉及到了包括GCD.Swift高级语法.缓存.硬盘读写.网络编程.图像 ...
- matlab常用小函数(一)
(第1维为对每一列操作,第2维维对每一行操作) sum 求和操作 max 求最大值操作 sum:求和操作 sum(A):矩阵A按列向求和(每一列求和),结果为一个行向量 sum(A,2):矩阵A按行向 ...
- Codeforces Round #315 (Div. 2)
这次可以说是最糟糕的一次比赛了吧, 心没有静下来好好的去思考, 导致没有做好能做的题. Problem_A: 题意: 你要听一首时长为T秒的歌曲, 你点击播放时会立刻下载好S秒, 当你听到没有加载到的 ...
- BZOJ 3677 连珠线
Description 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或蓝色的,珠子被编号为\(1\)到\(n\).这个游戏从一个珠子开始,每次会用如下方式添加 ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...