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 ...
随机推荐
- OC基础-day02
#pragma mark - Day02_01_对象的创建与使用 1)如何通过类创建一个对象 1. 类是抽象的,无法直接使用 2. 对象是类的一个具体实现,可以直接使用 3. 语法 类名 *对象名 = ...
- iOS UITableviewWrapperView 和 automaticallyAdjustsScrollViewInsets属性
关于在navigationController下面使用tableView在竖直方向会遇到frame的y值的困惑, 会遇到视图控制器的这个属性:automaticallyAdjustsScrollVie ...
- jquery 过滤器
1.基本选择器 基本选择器是JQuery中最常用的选择器,也是最简单的选择器,它通过元素id.class 和标签名来查找DOM元素.这个非常重要,下面的内容都是以此为基础,逐级提高的. 1).“$(“ ...
- new、delete用法(一)
第一部分:new的使用: #define DEBUG_NEW new(THIS_FILE, __LINE__)解释 THIS_FILE:表示当前类所处的文件名: __LINE__:表示分配内存操作所在 ...
- Windows phone 之 UserControl的应用
一.新建一个UserControl.xaml页面 MyUserControl.xaml 添加代码如下: <UserControl x:Class="bodypicture.MyUse ...
- Windows Phone 之下拉菜单ListPicker
默认情况下,Visual Studio的ToolBox里没有任何下拉菜单的控件可供使用,虽然可以手工输入代码使用隐藏的ComboBox来实现下拉菜单,但是显示出来的菜单与Metro UI主题不匹配.S ...
- 代码世界中的Lambda
“ λ ”像一个双手插兜儿,独自行走的人,有“失意.无奈.孤独”的感觉.λ 读作Lambda,是物理上的波长符号,放射学的衰变常数,线性代数中的特征值……在程序和代码的世界里,它代表了函数表达式,系统 ...
- php时间选择器亲测可以自己修改
由于前端的离职 造成我需要自己去做后台页面 所以有一个要填写生日的我就用了这个时间选择器 <?php /** * Created by PhpStorm. * User: Administ ...
- 2016022613 - redis连接命令集合
redis连接命令 1.ping 用途:检查服务器是否正在运行 返回数据pong,表示服务器在运行. 2.quit 用途:关掉当前服务器连接 3.auth password 用途:服务器验证密码 没有 ...
- 【C语言】printf函数详解
C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...