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. Maven CXF wsdl2Java 给指定名空间设置包名

    <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin< ...

  2. 06 python下

    # st='hello kitty {name} is {age}' # # print(st.count('l')) # 统计元素个数 # print(st.capitalize()) # 首字母大 ...

  3. JDK1.7 的 HashMap

    HashMap是一个用于存储key-value的键值对集合,每个键值对都是一个Entry.这些键值对分散存储在一个数组中,这个数组就是HashMap的主干. HashMap每个初始值都为null. 1 ...

  4. String和StringBuilder、StringBuffer的区别

    String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的. String:适用于少量的字符串操作的情况 StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情 ...

  5. SQL(ORACLE)

    查询数据库编码: select * from sys.nls_database_parameters;select * from sys.nls_session_parameters; replace ...

  6. Java学习笔记(二十):多态

    什么是多态 多态的好处 举个例子:需求:给饲养员提供一个喂养动物的方法,用于喂养动物 假如没有多态,会发现针对不同类型的动物,我们需要提供不同的feed方法来喂养,当需求变化时,比如增加动物,就要增加 ...

  7. c#: 任务栏进度显示(TaskbarManager)

    Win7及以上系统支持任务栏进度条,为有进度类应用显示进度于任务栏,甚为方便. 以c#之WinForm实现其,大多采用Windows API Code Pack这个方案,加多引用,比较繁琐,而我总也打 ...

  8. 129. Sum Root to Leaf Numbers pathsum路径求和

    [抄题]: Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a ...

  9. Add custom field in Material Master

    1.Add fields in the Append Structure of table MARA. 2.Configure SPRO IMG -> Logistics General -&g ...

  10. 源码安装 odoo12 -- 问题记录

    odoo12启动过程中遇到的问题,及解决办法:1.ImportError: No module named ‘win32service’pipenv install pypiwin32 2.Impor ...