Django Form&ModelForm
ModelForm:
首先导入所需模块
from django.forms import ModelFormfrom django.forms import widgets as form_widgetsfrom django.forms import fields
save方法,可以有个返回对象,这个对象中有传回来的所有数据
如:
form = form.save()
form.__str__() # 等同于str(form)
widgets可以手动为字段添加属性
attr={"class","c1"} 定义属性
choice={"value","text"} 定义字段
instance填充字段内容,一般用来编辑
扩展:
modelform在生成页面字段的时候,普通字段,一般的为input框,如果,绑定外键字段,那么就会显示select框
示例:
views.py
from django.shortcuts import render, HttpResponse
from . import models
from django.forms import ModelForm
from django.forms import widgets as form_widgets
class Modelform_class(ModelForm):
url = fields.CoiceField() # 如果表中没有,就增加显示,如果有,就覆盖,可以用来重写字段类型,如,原来,的url是input框,你要变成select,就可以这样重写
name = fields.CoiceField() # 单选框
hobby = fields.MultipleChoiceField() # 复选框
hobby2 = fields.CharField() # 普通字段
class Meta:
model = models.Role
fields = "__all__" # 展示所有字段
widgets = {
# 为字段定制属性
'name': form_widgets.TextInput(attrs={"class": "form-control", "id": "a1", })
}
def __init__(self,*args,**kwargs):
"""
为父类的init方法添加扩展功能,因为,如果下拉框,在生成后,值就不变,当我们在更新数据后,这个下拉框中不会显示新增的值,只有在重启之后才能显示,而这样扩展后,添加完就会在下拉框中显示
"""
super(Modelform_class,self).__init__(*args,**kwargs)
self.fields['url'].choices = ("value","text")
def test(request):
if request.method == "GET":
form = Modelform_class()
return render(request, 'test.html', {"form": form})
elif request.method == "POST":
form = Modelform_class(request.POST)
if form.is_valid():
form.save()
return HttpResponse("数据添加成功")
def test2(request):
obj = models.Role.objects.filter(pk=1).first()
if request.method == "GET":
form = Modelform_class(instance=obj)
return render(request, 'test2.html', {"form": form})
else:
form = Modelform_class(request.POST)
if form.is_valid():
form.save()
return HttpResponse("数据更新成功")
# -------------------------------
urls.py
from django.conf.urls import url
from django.contrib import admin
from app02.service import li
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test.html$', views.test),
url(r'^test2.html$', views.test2),
]
# -------------------------------
models.py
class Role(models.Model):
name= models.CharField(verbose_name='角色名称',max_length=32)
def __str__(self):
return self.name
# -------------------------------
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<form method="post" novalidate>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="提交 ">
</form>
</body>
</html>
# -------------------------------
test2.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<form method="post" novalidate>
{% csrf_token %}
{{ form.as_p }}
{# 可以循环这个from对象,可以单独展示某个字段 #}
{# {{ form.name }}#}
<input type="submit" value="提交 ">
</form>
</body>
</html>
modelform简单示例
modelform示例
Form
首先也是导入模块
required=True # 字段不能为空
error_messages # 自定义错误信息
问题:下拉框,新添加内容不展示,只有重启才能显示,解决办法如下
自动挡:
自动刷新添加的数据,但是有个弊端,它自动将value=pk,内容显示为对象(queryset对象),它依赖类里面的__str__方法,不推荐自动挡
手动挡:
我们开始只是定义这个字段,在__init__方法里,来手动刷新数据
from django.forms import Form
from django.forms import fields
from django.forms import widgets
from django.forms.models import ModelChoiceField
class UserInfoForm(Form):
name = fields.CharField(required=True, error_messages={"required": "用户名不能为空!"})
email = fields.EmailField(required=True, max_length=32)
# part = fields.ChoiceField(choices=models.Department.objects.values_list("id","title"))
part = fields.ChoiceField() # 这里什么都不写,只是定义一个下拉框,下面重写,这里与下面重写,称呼为手动挡,因为需要们手动来实现这个功能
# 再来个自动挡
hobby = ModelChoiceField(queryset=models.Department.objects.all())
def __init__(self, *args, **kwargs):
"""
同样的,为了解决新添加的数据无法及时显示,我们在这里扩展__init__方法,来手动刷新数据
:param args:
:param kwargs:
"""
super(UserInfoForm, self).__init__(*args, **kwargs)
self.fields['part'] = models.Department.objects.values_list("id", "title")
Django Form&ModelForm的更多相关文章
- Django Form ModelForm modelfromset
forms 组件 Form 组件 form表单完成的事情 提供input可以提交数据 对提交的数据进行校验 提供错误提示 定义form组件 from django import forms class ...
- Django Form和ModelForm组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django之路12——form modelform formset modelformset的各种用法
首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的 ...
- Django - Form和ModelForm
[TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...
- Django Form and ModelForm
Form介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输 ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- Django form模块使用心得
最近用Django 写了一个网站,现在来分享一下对Django form 的一些心得. 一,创建一个表单 创建一个Form表单有两种方式: 第一种方式是继承于forms.Form,的一个子类,通过在f ...
- Python Web框架篇:Django Form组件
Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
随机推荐
- Py中reshape中的-1表示什么【转载】
转自:https://blog.csdn.net/weixin_39449570/article/details/78619196 1.新数组的shape属性应该要与原来数组的一致,即新数组元素数量与 ...
- 【LeetCode每天一题】Fibonacci Number(斐波那契数列)
The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such th ...
- [Guitar self-learning] 基本乐理知识1. 度,升降记号#/b
度:是音程上面的单位, 指每两个音程(音名)之前的音距.(就像我们说身高时的cm一样, 用来表明当时的音高.) 升记号:# , 表明在当前的音高下, 升半个音高. 如 #3 == 4 降记号: ...
- vue中使用hotcss--stylus
页面中一直闪动这个. 后面改成scss后还是这样.还不知道原因
- pyCharm编辑器激活使用
1.打开激活窗口 2.选择 Activate new license with License server (用license server 激活) 3.在 License sever addres ...
- 多么痛的领悟---关于RMB数据类型导致的元转分分转元的bug
关于金额的数据类型,以及元转分分转元之间这种转换,以及元和分的比较,我相信很多人都踩过坑. 反正我是踩过. 而且,昨天和今天又重重的踩了两脚. 代付查询接口,支付中心给溢+响应的报文里,amount的 ...
- jQuery获取点击对象的父级
一.使用$('body').on('click','.index',function(event){})绑定事件时,例: <div class="project-box"&g ...
- factory源码分析——component_registry和object_registry
registry类主要是为object和component提供一个轻量级的代理(lightweight proxy)来方便factory实现: registry class从uvm_object_wr ...
- ASP.NET JSON(转http://www.360doc.com/content/14/0615/21/18155648_386887590.shtml)
概念介绍还是先简单说说Json的一些例子吧.注意,以下概念是我自己定义的,可以参考.net里面的TYPE的模型设计如果有争议,欢迎提出来探讨!1.最简单:{"total":0} t ...
- 阿里云Centos7 yum安装MySQL5.6
安装mysql5姿势是要先安装带有可用的mysql5系列社区版资源的rpm包 [root@iZ28gvqe4biZ ~]# rpm -Uvh http://dev.mysql.com/get/mysq ...