Django Model Form
ModelForm
ModelForm结合了Form和Model,将models的field类型映射成forms的field类型,复用了Model和Model验证,
写更少的代码,并且还实现了存储数据库的简单方法
models field类型和forms field类型映射关系
https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#field-types
from django.db import models
from django.forms import ModelForm
from django import forms
from django.utils.translation import ugettext_lazy as _ TITLE_CHOICES = (
('MR', 'Mr.'),
('MRS', 'Mrs.'),
('MS', 'Ms.'),
) class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=3, choices=TITLE_CHOICES)
birth_date = models.DateField(blank=True, null=True) def __str__(self):
return self.name class Book(models.Model):
name = models.CharField(max_length=100)
authors = models.ManyToManyField('Author') def __str__(self):
return self.name class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ['name', 'title', 'birth_date'] class BookForm(ModelForm):
class Meta:
model = Book
fields = ['name', 'authors']
ModelForm save()方法
form.is_valid()之后,form.save()可以直接保存到数据库

Django ModelForm Meta
用来配置前端模板的各种选项,可以和Form对应起来,labels、widgets、help_texts、error_messages等,复数形式
class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ['name', 'title', 'birth_date']
# fields = '__all__'
# exclude = ('birth_date',)
labels = {
'name': 'Writer',
}
widgets = {
'name': forms.Textarea(attrs={'cols': 80, 'row':20})
}
help_texts = {
'name': _('Some useful help text') # 需要翻译文件
}
error_messages = {
'name':{
'max_length':_("This writer's name is too long.")
},
}
Django ModelForm 自定义验证
先进行 class Meta中的Model验证,在进行每个字段 clean_name()验证,最后进行clean()验证
class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ['name', 'title', 'birth_date'] # 校验单个字段
def clean_name(self):
name = self.cleaned_data['name'] # 获取数据
if len(name) < 30:
raise ValidationError("Length must be more than 30") # 非法时,抛出异常
return name # 返回该字段值 # 多个字段联合校验
def clean(self):
clean_data = super(AuthorForm, self).clean()
name = clean_data.get('name')
title = clean_data.get('title')
if len(name) < 40 and title == "MR":
raise ValidationError('xxxx') # 对应 form.non_field_errors
view和模板中使用 Model Form(最佳实践)
# form.py
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField() def __str__(self):
return self.name class PublisherForm(ModelForm):
class Meta:
model = Publisher
# fields = ['name', 'address', 'city', 'state_province', 'country', 'website']
# fields = '__all__'
fields = "__all__" # veiws.py
def publisher_add2(request):
if request.method == "POST":
form = PublisherForm(request.POST)
if form.is_valid():
publisher = form.save()
return HttpResponse('添加成功')
else:
form = PublisherForm()
return render(request, 'books2/publisher_add.html', {'form': form }) # books/templates/publish_add.html
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit"/>
</form>
POST:
- form = PublisherForm(request.POST)
- form.is_valid()
- form.save()
GET:
- form = PublisherForm()
Django Model Form inital and instance
model中default='中国' 可以在数据库的层面设置默认值,前端是可以正常显示默认值的
form = PublisherForm(initial={'city':'北京'}),在view 层面设置默认值,字段层面
publisher = get_object_or_404(Publisher, id=publisher_id); form = PublisherForm(instance=publisher),默认值是整个对象
form = PublisherForm(request.POST, instance=publisher),更新数据时,request.POST满足条件时更新;不满足条件时还是原来publisher
# views.py
def publisher_update(request, publisher_id):
publisher = get_object_or_404(Publisher, pk=publisher_id) if request.method == "POST":
form = PublisherForm(request.POST, instance=publisher)
if form.is_valid():
publisher = form.save()
return HttpResponse('更新成功') form = PublisherForm(instance=publisher)
return render(request, 'books2/publisher_update.html', {'form':form})
Django form bootstrap 插件
参考链接:
https://github.com/dyve/django-bootstrap3
安装:
pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com django-bootstrap3
使用:
{% load bootstrap3 %}
<div class="container">
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">{% bootstrap_icon "star" %} Submit</button>
{% endbuttons %}
</form>
</div>
Django Model Form的更多相关文章
- django model form 保存方法 django-rest-framework save 修改某一项值 方法
django Model Form django-rest-framework save 方法 修改某个数据的值
- 自定义django model form、admin action
https://www.cnblogs.com/0zcl/archive/2017/03/22/6580279.html 先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin ...
- Django的model form组件
前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...
- Django 的 model form 组件
Django 的 model form 组件 Model Form 组件的由来 之前介绍过 Django 的 Form 组件(Django的Form表单)使用方法,Form 组件能够帮我们做三件事: ...
- 14 Django之Form和Model Form组件
一.什么是Form 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用 ...
- Django的Form
Django的Form有两个基本用途: 1.用于生成html的Form表单 2.用于后台做表单验证 #!/usr/bin/env python # -*- coding:utf-8 -*- impor ...
- Django Model field reference
===================== Model field reference ===================== .. module:: django.db.models.field ...
- Django学习之四:Django Model模块
目录 Django Model 模型 MODEL需要在脑子里记住的基础概念 区分清楚,必须不能混淆的 class Meta 内嵌元数据定义类 简单model创建实例 数据源配置 接着通过models在 ...
- Django的form表单
html的form表单 django中,前端如果要提交一些数据到views里面去,需要用到 html里面的form表单. 例如: # form2/urls.py from django.contrib ...
随机推荐
- Django文件存储(一)默认存储系统
Django默认使用的文件存储系统'django.core.files.storage.FileSystemStorage'是一个本地存储系统,由settings中的DEFAULT_FILE_STOR ...
- MATLAB——矩阵排序详解
<span style="font-size:18px;">(1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排 ...
- leetcode15
class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); Li ...
- SQLite在Android程序中的使用方法,SQLite的增删查改方法
Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序 ...
- 使用wireshark以及filddler配合抓去手机端的TCP以及HTTP请求
在测试手机客户端时,有时候需要查看网络请求状况.使用在IDE中查看log的方式,能够解决问题,但是会比较复杂.wireshark不能够做代理,而fiddler主要是抓HTTP请求,没有wireshar ...
- Halcon常用算子02
threshold:阈值分割 minGray<=g<=maxGray select_shape:选取特定区域(Region) regiongrowing:区域生长法分割图像获得 ...
- 图像处理项目——生成csv文件提高读取效率
利用pyhton脚本生成csv文件 *开发环境为windows PyCharm*使用的是pyhton脚本*生成人脸和人脸对应的标签的csv文件 一:主要步骤 1.载入对应路径2.提取每一张图片对应的位 ...
- python中tolist()命令
- APIcloud微信支付和支付宝支付(方案2,主要在后台进行)
支付宝代码 var aliPay = api.require('aliPay'); api.ajax({ url: yuming+'index.php/api/Alipay/getOrder', me ...
- H3C网络设备配置SSH登录
使用SSH+密码认证(基本SSH配置方法)注:在用户使用SSH登录交换机时,交换机对所要登录的用户使用密码对其进行身份验证生成RSA和DSA密钥对[H3C]public-key local creat ...