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. dubbo常用配置及注意事项

    1.启动时检查缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true. 关闭所有服务的启动时检查:(没有提供者时报错 ...

  2. python字符串前面的r/u/b的意义 (笔记)

    u/U:表示unicode字符串 : 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. r/R:非转义的原始字符串: 与普通字符相比,其他相对特殊的字符,其中可能包含 ...

  3. python中 函数名加括号与不加括号

    加括号是返回函数的结果,不加括号相当于函数的调用.

  4. 解决strcmp的错误以及VS的快捷键

    主要是C++数组作业中发现的一些问题. 第一点是关于strcat函数 我用VS2018调用strcat的时候报错,错误信息提示strcat不安全(?)要用strcat_s.修改后,可成功运行. 但这两 ...

  5. Spring中注入对象为NULL

    Java工程报错, java.lang.reflect.InvocationTargetException,网上搜索过后,发现是注入错误,通过调试发现,具体报错位置是某个dao层对象为null,进而引 ...

  6. LevelDB源码分析-Compact

    Compaction compact由背景线程完成,代码中触发背景线程的函数为: void DBImpl::MaybeScheduleCompaction() { mutex_.AssertHeld( ...

  7. linux 强制删除yum安装的php7.2

    由于支付宝SDK只支持php7.1,因为需要删除之前安装的7.2版,进行降级.通过yum remove不能完全删除php,必须通过rpm方式卸载.由于php安装模块间有依赖,因此需要按顺序进行卸载.如 ...

  8. Gson的入门使用

    Java对象和Json之间的互转,一般用的比较多的两个类库是Jackson和Gson,下面记录一下Gson的学习使用. 基础概念:  Serialization:序列化,使Java对象到Json字符串 ...

  9. poj 1639 最小k度限制生成树

    题目链接:https://vjudge.net/problem 题意: 给各位看一下题意,算法详解看下面大佬博客吧,写的很好. 参考博客:最小k度限制生成树 - chty - 博客园  https:/ ...

  10. 【Android】异步加载布局探索

    最近在做的项目页面复杂导致布局嵌套多层,而且又使用了百分比布局(可能主要是这个原因)导致页面加载的时候主线程会被阻塞, 那要想减少主线程阻塞,一来就是简化布局,减轻LayoutInflater的负担, ...