modelform组件以及ChoiceField属性
一. Forms组件补充
1.__init__()
如果继承forms.Form的类中的每一个字段,或者大部分字段都做了相同的约束,可以将该约束放到__init__中编写
实例:每一个字段都需要添加form-control类名
- class BookForm(forms.Form):
- title = forms.CharField(max_length=32)
- pub_date = forms.DateField()
- price = forms.DecimalField(max_digits=8, decimal_places=2)
- def __init__(self,*args,**kwargs):
- super().__init__(*args,**kwargs)
- for field in self.fields.values():
- field.widget.attrs.update({"class":"form-control"})
2.ChoiceField属性,下拉菜单(元组套元组的形式)
(1)choices作用:在数据库中用元组的第一项作为存储的值,在显示时,将元组的第二项作为显示的内容,便于前端使用下拉框
例:
- class Book(models.Model):
- id=models.AutoField(primary_key=True)
- title=models.CharField(max_length=32)
- gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1)
(2)与get_gender_display()方法同时使用,用来获取元组第二项的内容
(3)在forms组件中渲染时,只需将类型改变成ChoiceField()
例:
- class BookForm(forms.Form):
- title = forms.CharField(label="书名",max_length=32)
- pub_date = forms.DateField(label="出版社")
- price = forms.DecimalField(label="价格",max_digits=8, decimal_places=2)
- gender=forms.ChoiceField(choices=((1,"男"),(2,"女")))
(4) Choices的问题:小元组的内容是固定的,无法随着数据库的更改二更改,不灵活
3.ModelChoiceField属性
作用:帮助渲染前端页面的下拉框
优势:ModelChoiceField可以接收queryset属性的参数,内容可以随着数据库的更改而更改
例:
- class BookForm(forms.Form):
- title = forms.CharField(label="书名",max_length=32)
- gender=forms.ChoiceField(choices=((1,"男"),(2,"女")))
- publish=forms.ModelChoiceField(queryset=Publish.objects.all())
4.ModelMultipleChoiceField属性
作用:帮助前端渲染页面的多选框,内容也能随着数据库的改变而改变
例:
- class BookForm(forms.Form):
- gender=forms.ChoiceField(choices=((1,"男"),(2,"女")))
- publish=forms.ModelChoiceField(queryset=Publish.objects.all())
- author=forms.ModelMultipleChoiceField(queryset=Author.objects.all())
二. modelForm组件
1.作用:
正常情况下的model和form是没有关系的,所有forms组件必须我们自己编写,但是ModelForm可以与model之间形成对应关系,这样就免去了我们自己写model
2.语法:
(1)需要先引入forms组件的model类:from django.forms import ModelForm
(2)编写ModelForm类:
- class BookModelForm(forms.ModelForm):
- class Meta:
- model=Book #与之关联的模型类
- # fields="__all__" #可以渲染所有字段
- fields=["title","price"] #可以渲染部分字段
- exclide=[“title”] #可以渲染除某些字段外的所有字段
(3)为公共字段或大多数字段添加内容,批量处理(添加__init__方法)
Input标签的样式属性:
- def __init__(self,*args,**kwargs):
- super().__init__(*args,**kwargs)
- for field in self.fields.values():
- field.widget.attrs.update({"class":"form-control"})
将错误转换成中文:
- def __init__(self,*args,**kwargs):
- super().__init__(*args,**kwargs)
- for field in self.fields.values():
- field.error_messages={"required":"不能为空"}
(4)为单个字段添加内容(当每个字段的内容不同时)
- Labels方法:
- class BookModelForm(forms.ModelForm):
- class Meta:
- model=Book
- fields="__all__"
- labels={"title":"书籍名称","price":"价格"}
- error_messages方法:
- class BookModelForm(forms.ModelForm):
- class Meta:
- model=Book
- fields="__all__"
- error_messages={"title":{"required":"书籍名称不能为空"}}
- widgets字段:
- 先引入:from django.forms import widgets as Fwidgets
- class BookModelForm(forms.ModelForm):
- class Meta:
- model=Book
- fields="__all__"
- widgets = {
- 'pub_date': Fwidgets.Input(attrs={'type': 'date'})
- }
3.forms组件有的接口,modelform也有,如is_valid,clean_data,errors
除了forms组件有的接口外,modelform还有save方法
Save方法会自动将干净的数据添加到表中,含有一对一,一对多,多对多的字段和表也会被处理好
4.编辑页面,默认value值得做法:
(1)取到待编辑的model对象
例:book_obj=Book.objects.fillter(id=1).first()
(2)将model对象传入modelform
例:form=BookModelForm(request.POST,instance=book_obj)
得到的form就是待前端页面渲染的对象
结果:如果对ModelForm传了instance就相当于更新操作,没传instance,就相当于创建操作
三.include
作用:当某一段代码被重复利用的次数很多时,可以将其写到一个文件中,其他地方引用即可,减少代码的冗余性
例:在form.html中
- <form action="" method="post" novalidate>
- {% csrf_token %}
- {% for field in form %}
- <div class="form-group">
- <label for="title">{{ field.label }}</label>
- {{ field }}
- <span>{{ field.errors.0 }}</span>
- </div>
- {% endfor %}
- <input type="submit" value="提交" class="btn btn-default pull-right">
- </form>
在增加书籍页面中:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
- integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
- </head>
- <body>
- <h3>添加书籍</h3>
- <div class="container">
- <div class="row">
- <div class="col-md-6 col-md-offset-3">
- {% include 'form.html' %} #代表将form.html中的代码放到这里
- </div>
- </div>
- </div>
- </body>
- </html>
四.ModelForm的使用模板(做添加和编辑页面)
1.在models.py中:正常写模型表
- class Book(models.Model):
- nid=models.AutoField(primary_key=True)
- title=models.CharField(max_length=32)
- price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99
- pub_date=models.DateTimeField() # "2012-12-12"
- publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE)
- authors=models.ManyToManyField(to="Author")
- def __str__(self):
- return self.title
2.在form.py中:构建ModelForm
- from django.forms import widgets as Fwidgets
- class BookModelForm(forms.ModelForm):
- class Meta:
- model=Book
- fields="__all__"
- labels={"title":"书籍名称","price":"价格"}
- widgets = {
- 'pub_date': Fwidgets.Input(attrs={'type': 'date'})
- }
- def __init__(self,*args,**kwargs):
- super().__init__(*args,**kwargs)
- for field in self.fields.values():
- field.widget.attrs.update({"class":"form-control"})
- field.error_messages={"required":"不能为空"}
- 等同于写了以下代码:
- class BookForm(forms.Form):
- title=forms.CharField(max_length=32)
- price=forms.IntegerField()
- pub_date=forms.DateField(widget=widgets.TextInput(attrs={"type":"date"}))
- #publish=forms.ChoiceField(choices=[(1,"AAA"),(2,"BBB")])
- publish=forms.ModelChoiceField(queryset=Publish.objects.all())
- authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())
3.添加逻辑
- def add(request):
- if GET请求:
- form=BookModelForm()
- return render(request,{“form”:form})
- else POST请求:
- form=BookModelForm(request.POST)
- if form.is_valid():
- form.save()
- return render(“/”)
- else:
- return render(request,{“form”:form})
4.编辑逻辑
- def edit(request,id):
- edit_obj=Book.objects.get(pk=id)
- if GET请求:
- form=BookModelForm(instance=edit_obj)
- return render(request,{“form”:form})
- else POST请求:
- form=BookModelForm(request.POST,instance=edit_obj)
- if form.is_valid():
- form.save()
- return rediecr(“/”)
- else:
- return render(request,{“form”:form})
5.登录和编辑共同的渲染页面
- <form action="" method="post" novalidate>
- {% csrf_token %}
- {% for field in form %}
- <div class="form-group">
- <label for="title">{{ field.label }}</label>
- {{ field }}
- <span>{{ field.errors.0 }}</span>
- </div>
- {% endfor %}
- <input type="submit" value="提交" class="btn btn-default pull-right">
- </form>
modelform组件以及ChoiceField属性的更多相关文章
- day063 form 和modelform组件
注册功能: (写一个简单的注册功能,要求用户名长度不得小于6位.) 普通方式写注册功能 views视图下: def register(request): error_msg=' ' if reque ...
- Django之Form、ModelForm 组件
Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- Django-form组件和ModelForm组件
一. 构建Form表单 通过建一个类,添加需要进行验证的form字段,继而添加验证条件 from django import forms from django.forms import widget ...
- Django - ModelForm组件
一.ModelForm组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样一张学生表, ...
- Django之Form与ModelForm组件
Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...
- day 64 Django基础十之Form和ModelForm组件
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...
- Django框架11 /form组件、modelForm组件
Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
随机推荐
- Valid page threshold based garbage collection for solid state drive
A method for garbage collection in a solid state drive (SSD) includes determining whether the SSD is ...
- 从DOS bat启动停止SQL Server (MSSQLSERVER)服务
由于机器上装了SQL Server2008,导致机器开机变慢,没办法只能让SQL Server (MSSQLSERVER) 服务默认不启动.但是每次要使用SQL Server时就必须从控制面板-管理 ...
- 用WPF实现打印及打印预览
原文:用WPF实现打印及打印预览 应该说,WPF极大地简化了我们的打印输出工作,想过去使用VC++做开发的时候,打印及预览可是一件极麻烦的事情,而现在我不会再使用C++来做Windows的桌面应用了- ...
- AABB边框、OBB边框、通过比较球包围
1) AABB 包围盒: AABB 包围盒是与坐标轴对齐的包围盒, 简单性好, 紧密性较差(尤其对斜对角方向放置的瘦长形对象, 採用AABB, 将留下非常大的边角空隙, 导致大量不是必需的包围盒相交測 ...
- matlab 矢量化编程(三) —— 软阈值函数
dj,k^=⎧⎩⎨⎪⎪dj,k−λ,dj,k≥λ0,otherwisedj,k+λ,dj,k≤−λ function y = soft(x, T) y = (x - abs(T) > 0) .* ...
- Matlab随笔之插值与拟合(下)
原文:Matlab随笔之插值与拟合(下) 1.二维插值之插值节点为网格节点 已知m x n个节点:(xi,yj,zij)(i=1…m,j=1…n),且xi,yi递增.求(x,y)处的插值z. Matl ...
- DRP-ThreadLocal简单的理解
简单就是jar一类套餐包.在一个简单的事情是一个工具类!该工具可以做?该工具被用来写多线程程序,行.多线程是有效的.你只能去网上找资料,由于今天我们仅仅来介绍ThreadLocal的知识. 我们来 ...
- android 随着认识的去除率EditText(它配备了防抖效果)
Android它没有提供的类似至ios自带的输入框效果清晰(ios简单地只加属性可实现).因此,Android其中 我们要如何实现就需要这种效果用自己的定义的控件实现. 思路:能够使用一个Linear ...
- Symbol not found: _lua_objlen
lua: error loading module 'cjson' from file '/usr/local/lib/lua/5.3/cjson.so': dlopen(/usr/local/lib ...
- WPF特效-绘制实时2D激光雷达图
原文:WPF特效-绘制实时2D激光雷达图 接前两篇: https://blog.csdn.net/u013224722/article/details/80738619 https://blog.cs ...