一、保存用户输入内容

如果用户输入一张表单提交后出现错误时,会出现重现填写的情况。我们可以把用户输入的信息保存下来,并返回到前台页面,这样用户就无需再次输入。

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(二)的更多相关文章

  1. Django中的Form

    Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from dj ...

  2. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  3. Django中的form组件

    Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...

  4. 转 Django中的Form

    https://www.cnblogs.com/chenchao1990/p/5284237.html Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 ...

  5. Django中模型(二)

    Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...

  6. Django 中的Form表单认证

    一.Form表单   1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签   1.2 创建表单类Form 1. 创建 ...

  7. django中的 form 表单操作

     form组件  1. 能做什么事?   1. 能生成HTML代码  input框   2. 可以校验数据   3. 保留输入的数据   4. 有错误的提示   1. 定义   from django ...

  8. django中的Form和ModelForm中的问题

    django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新 方法一:重写构造方法,在构造方法中重新去获取值 class UserForm(forms.Form): ...

  9. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  10. Django 中的Form、ModelForm

    一.ModelForm 源码 class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass): pass def modelform_fact ...

随机推荐

  1. CI 笔记,借鉴的4个辅助自定义函数

    在System的core的common.php中,借鉴的4个自定义函数, 摘自后盾网的CI教程 /** * 格式化打印函数 * @param [type] $arr [数组] * @return [t ...

  2. [学习笔记]设计模式之Proxy

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “魔镜啊魔镜,谁是这个世界上最美丽的人?” 每到晚上,女王都会问魔镜相同的问题(见Decorator模式).这是她还曾身为女巫时留下的 ...

  3. Apache提示You don't have permission to access / on this server问题解决

    测试时遇到将一本地目录设置为一apache的虚拟主机,在httpd-vhosts.conf文件中进行简单设置,然后在hosts文件中将访问地址指向本地,启动apache,进行访问,却出现了You do ...

  4. PHP设计模式之:策略模式

    <?phpabstract class Strategy{    public abstract function AlgorithmInterface();} class ConcreteSt ...

  5. js 中对象属性的特性

    数据属性: 数据属性包含一个数据值的位置,在这个位置可以读取和写入值. 4个描述的行为特性: writable  表示能否修改属性的值.默认为true Enumerable 表示能否过过for in循 ...

  6. 代码世界中的Lambda

    “ λ ”像一个双手插兜儿,独自行走的人,有“失意.无奈.孤独”的感觉.λ 读作Lambda,是物理上的波长符号,放射学的衰变常数,线性代数中的特征值……在程序和代码的世界里,它代表了函数表达式,系统 ...

  7. linux自定义开机启动服务

    转 http://www.cnblogs.com/jimeper/archive/2013/03/12/2955687.html 手工创建服务 1.在/etc/rc.d/init.d目录下创建shel ...

  8. php开源项目学习二次开发的计划

      开源项目: cms 国内 dedecms cmstop 国外 joomla, drupal 电商 国内 ecshop 国外 Magento 论坛 discuz 博客 wordpress   学习时 ...

  9. Object之魔术函数__toString() 直接输出对象引用时自动调用

    __toString()是快速获取对象的字符串信息的便捷方式 在直接输出对象引用时自动调用的方法. __toString()的作用 当我们调试程序时,需要知道是否得出正确的数据.比如打印一个对象时,看 ...

  10. git+Coding.netの小试牛刀

    一.将本地项目推送到Coding中 1.在Coding中新建项目,填写项目名称和项目描述,设置属性,勾选初始化仓库