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 ...
随机推荐
- SQL打印全年日历
数据库环境:SQL SERVER 2008R2 我之前有写过打印本月日历的SQL,里头有详细的说明.具体请参考前面的博文——生成本月日历. 全年日历只是在本月日历的基础上加了月信息,并按月份分组求得. ...
- 类库探源——System.Delegate
一.MSDN 描述 Delegate 类:表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法.(是不是感觉很像C语言中的函数指针 :) ) 命名空间: System 程序集: ...
- cocos2dx入门分析 hello world
打开新建的"findmistress"项目,可以看到项目文件是由多个代码文件及文件夹组成的,其中 Hello World 的代码文件直接存放于该项目文件夹中.下面我们来详细介绍一下 ...
- List集合的去除重复性练习
package com.java.b.listdmeo.www; import java.util.ArrayList;import java.util.Iterator; import com.ja ...
- [Lua]基于cc.load('mvc') .ViewBase索引资源方案
local MainScene = class("MainScene", cc.load("mvc").ViewBase) MainScene.RESOURCE ...
- ecshop---京东手机模板js的eval产生冲突的解决方法。
今天弄ecshop手机模板的时候,发现首页的广告图出不来,js报错
- C# 获取路径中文件名、目录、扩展名等
string path = "C:\\dir1\\dir2\\foo.txt"; string str = "GetFullPath:" + Path.GetF ...
- Ext.String 方法
1.Ext.String.htmlEncode(value); 编码字符串,对其中特殊字符进行转义 xt.String.htmlEncode("hello'world"); //& ...
- WPF 分页控件 WPF 多线程 BackgroundWorker
WPF 分页控件 WPF 多线程 BackgroundWorker 大家好,好久没有发表一篇像样的博客了,最近的开发实在头疼,很多东西无从下口,需求没完没了,更要命的是公司的开发从来不走正规流程啊, ...
- C#入门教程笔记
1.C# string api Substring(),//截取字符串,接受两个参数,第一个是偏移量,第二个是截取长度 replace(),//替换字符串,接受两个参数,第一个指定被替换的字符串,第二 ...