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标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输 ...
-
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属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
-
Django的ModelForm
基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm ...
随机推荐
-
java记录
1. 包装类与自动装箱问题:在justjavac的博客上看到翻译的一篇文章 离开java,寻找更佳语言的十大理由 中关于自动装箱的一个描述: 这个特性是为了解决因原生类型的存在所导致的问题,在Java ...
-
jQuery-1.9.1源码分析系列(四) 缓存系统
先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制,点击这里查看.不过Sizzle的缓存只是对内使用的(内部自己存,自己取).接下来分析jQuery可以对外使用的缓存(可存可取). 首先需 ...
-
File相关的读取和写入以及复制
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileI ...
-
ios category类别的使用
ios category类别的使用 Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category).类别用于对一个已经存在的类添加方法(Methods).你只需要知道这个 ...
-
DB2中字符、数字和日期类型之间的转换
DB2中字符.数字和日期类型之间的转换 一般我们在使用DB2或Oracle的过程中,经常会在数字<->字符<->日期三种类 型之间做转换,那么在DB2和Oracle中,他们分别 ...
-
350 - Pseudo-Random Numbers
Pseudo-Random Numbers Computers normally cannot generate really random numbers, but frequently are ...
-
k近邻算法
k 近邻算法是一种基本分类与回归方法.我现在只是想讨论分类问题中的k近邻法.k近邻算法的输入为实例的特征向量,对应于特征空间的点,输出的为实例的类别.k邻近法假设给定一个训练数据集,其中实例类别已定. ...
-
Target优化
优化目标主要包括以下几方面: 1 优化平面文件 如果目标平面文件在某机器的共享目录下,则该机器最好是专门用于文件存储的,如果还应用于其他非文件存储任务,则会降低加载效率 如果Integration s ...
-
java基础-day13
第01天 java面向对象 今日内容介绍 u 继承 u 抽象类 第1章 继承 1.1 继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继 ...
-
C#把Xml转换为DataSet的两种方法
转:https://blog.csdn.net/beyondqd/article/details/6724676 下面给出两个实现XML数据转成DataSet的两个方法. 第1种: //通过传入的特定 ...