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的更多相关文章

  1. django model form 保存方法 django-rest-framework save 修改某一项值 方法

    django Model Form django-rest-framework save 方法 修改某个数据的值

  2. 自定义django model form、admin action

    https://www.cnblogs.com/0zcl/archive/2017/03/22/6580279.html 先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin ...

  3. Django的model form组件

    前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...

  4. Django 的 model form 组件

    Django 的 model form 组件 Model Form 组件的由来 之前介绍过 Django 的 Form 组件(Django的Form表单)使用方法,Form 组件能够帮我们做三件事: ...

  5. 14 Django之Form和Model Form组件

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

  6. Django的Form

    Django的Form有两个基本用途: 1.用于生成html的Form表单 2.用于后台做表单验证 #!/usr/bin/env python # -*- coding:utf-8 -*- impor ...

  7. Django Model field reference

    ===================== Model field reference ===================== .. module:: django.db.models.field ...

  8. Django学习之四:Django Model模块

    目录 Django Model 模型 MODEL需要在脑子里记住的基础概念 区分清楚,必须不能混淆的 class Meta 内嵌元数据定义类 简单model创建实例 数据源配置 接着通过models在 ...

  9. Django的form表单

    html的form表单 django中,前端如果要提交一些数据到views里面去,需要用到 html里面的form表单. 例如: # form2/urls.py from django.contrib ...

随机推荐

  1. Django文件存储(一)默认存储系统

    Django默认使用的文件存储系统'django.core.files.storage.FileSystemStorage'是一个本地存储系统,由settings中的DEFAULT_FILE_STOR ...

  2. MATLAB——矩阵排序详解

    <span style="font-size:18px;">(1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排 ...

  3. leetcode15

    class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); Li ...

  4. SQLite在Android程序中的使用方法,SQLite的增删查改方法

    Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序 ...

  5. 使用wireshark以及filddler配合抓去手机端的TCP以及HTTP请求

    在测试手机客户端时,有时候需要查看网络请求状况.使用在IDE中查看log的方式,能够解决问题,但是会比较复杂.wireshark不能够做代理,而fiddler主要是抓HTTP请求,没有wireshar ...

  6. Halcon常用算子02

    threshold:阈值分割       minGray<=g<=maxGray select_shape:选取特定区域(Region) regiongrowing:区域生长法分割图像获得 ...

  7. 图像处理项目——生成csv文件提高读取效率

    利用pyhton脚本生成csv文件 *开发环境为windows PyCharm*使用的是pyhton脚本*生成人脸和人脸对应的标签的csv文件 一:主要步骤 1.载入对应路径2.提取每一张图片对应的位 ...

  8. python中tolist()命令

  9. APIcloud微信支付和支付宝支付(方案2,主要在后台进行)

    支付宝代码 var aliPay = api.require('aliPay'); api.ajax({ url: yuming+'index.php/api/Alipay/getOrder', me ...

  10. H3C网络设备配置SSH登录

    使用SSH+密码认证(基本SSH配置方法)注:在用户使用SSH登录交换机时,交换机对所要登录的用户使用密码对其进行身份验证生成RSA和DSA密钥对[H3C]public-key local creat ...