一. 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属性的更多相关文章

  1. day063 form 和modelform组件

    注册功能: (写一个简单的注册功能,要求用户名长度不得小于6位.) 普通方式写注册功能  views视图下: def register(request): error_msg=' ' if reque ...

  2. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  3. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  4. Django-form组件和ModelForm组件

    一. 构建Form表单 通过建一个类,添加需要进行验证的form字段,继而添加验证条件 from django import forms from django.forms import widget ...

  5. Django - ModelForm组件

    一.ModelForm组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样一张学生表, ...

  6. Django之Form与ModelForm组件

    Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...

  7. day 64 Django基础十之Form和ModelForm组件

    Django基础十之Form和ModelForm组件   本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...

  8. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  9. 6月28日 Django form组件 和 modelform组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

随机推荐

  1. 利用WPF建立自己的3d gis软件(非axhost方式)(三)矢量数据显示控制

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(三)矢量数据显示控制 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew 密 ...

  2. 11991 - Easy Problem from Rujia Liu?(的基础数据结构)

    UVA 11991 - Easy Problem from Rujia Liu? 题目链接 题意:给一个长度n的序列,有m询问,每一个询问会问第k个出现的数字的下标是多少 思路:用map和vector ...

  3. 【转】Mysql rownum 实现 及应用

    Mysql rownum 实现 转自:http://blog.csdn.net/saydo/article/details/22725953   SELECT @rownum:=@rownum+1 A ...

  4. 将指定路径下的所有SVG文件导出成PNG等格式的图片(缩略图或原图大小)

    原文:将指定路径下的所有SVG文件导出成PNG等格式的图片(缩略图或原图大小) WPF的XAML文档(Main.xaml): <Window x:Class="SVG2Image.Ma ...

  5. 《得知opencv》注意事项——矩阵和图像处理——cvAdd、cvAddS and cvAddWeighted

    矩阵和图像操作 (1)cvAdd函数 其结构 void cvAdd(//图像加和 const CvArr* src1,//第一个原矩阵 const CvArr* src2,//第二个原矩阵 CvArr ...

  6. 跟我学ASP.NET MVC之十:SportsStrore安全

    摘要: 在之前的文章中,我给SportsStore应用程序添加了产品管理功能,这样一旦我发布了网站,任何人都可能修改产品信息,而这是你必须考虑的.他们只需要知道你的网站有这个功能,以及功能的访问路径是 ...

  7. python3获取天气预报

    #!/usr/local/bin/python3 #coding=utf-8 ''' Created on 2011-2-25 @author: http://www.cnblogs.com/txw1 ...

  8. python3操作注册表设置/取消IE代理

    import io, sys, time, re, os import winreg def enableProxy(IP, Port): proxy = IP + ":" + s ...

  9. android 玩愤怒的小鸟等游戏的时候全屏TP失败

    1.tp driver的tpd_down()和tpd_up()函数不需要进行报告id号码.自己主动顶级赛: 2.tpd_up()功能只需要报告BTN_TOUCH和mt_sync信息,其他信息未报告,如 ...

  10. 【iOS发展-49】的插件-插件该文档的凝视VVDocumenter安装与使用

    文件凝视是/**   */.快捷键///. 但是,这需要安装插件.VVDocumenter. 下载链接:https://github.com/onevcat/VVDocumenter-Xcode (1 ...