Django使用普通表单、Form、以及modelForm操作数据库方式总结
Django使用普通表单、Form、以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样:
- 进入填写表单页面;
- 在表单页面填写信息,并提交;
- 表单数据验证
- 验证成功,和数据库进行交互(增删改查);
- 验证成功,页面提示表单填写失败;
一、Django使用普通表单操作数据库
1、html代码:
<form action="/add/" method="post" name="addbook">
{% csrf_token %} <p>
<p><span>用户:</span><input type="text" placeholder="用户" name="author"></p>
<p><span>用户年龄:</span><input type="text" placeholder="用户年龄" name="author_age"></p>
<input type="submit" value="增加">
</form>
2、点击增加后,页面判断填写字段是否合法(使用JavaScript或JQuery实现判断)
前端校验后,在/add/对应的view对数据进行校验以及数据保存
from polls.models import Person #导入对应model from django.http import HttpResponseRedirecdef addbooktodatabase(request):
# 获取参数前端传递的参数
if request.method == "GET":
author_name = request.GET["author"]
author_age = request.GET["author_age"]
else:
author_name = request.POST["author"]
author_age = request.POST["author_age"]
#对前端参数按业务逻辑进行校验
#代码省略 ## 保存数据到数据库
person = Person()
person.name = author_name
person.age = author_age
person.save() return HttpResponseRedirect('/addok/') 二、Django使用自有插件Form表单操作数据库
和方法一的使用普通表单相比,使用django的Form表单更方便快捷地生成前端form表单以及对字段的校验规则;
from django.shortcuts import render, HttpResponse, redirect
from django.forms import Form, fields, widgets
from model import * #导入对应的model
#Form验证
class TestForm(Form):
inp1 = fields.CharField(min_length=4, max_length=8)
inp2 = fields.EmailField()
inp3 = fields.IntegerField(min_value=10, max_value=100) View文件如下(添加):
def test(request):
if request.method == 'GET':
obj = TestForm()
return render(request, 'test.html', {'obj': obj})
else:
form = TestForm(request.POST)
if obj.is_valid():
#验证合格,前端的数据保存在form.cleaned_data,model的create函数保存到数据库
obj = models.Article.objects.create(**form.cleaned_data)
models.ArticleDetail.objects.create(content=content, article=obj)
return HttpResponse('提交成功')
如果是修改,相应代码改成:
obj = admin_obj.model.objects.get(id=obj_id)
if request.method == "GET":
obj_form = model_form(instance=obj)
elif request.method == "POST":
obj_form = model_form(instance=obj,data=request.POST)
if obj_form.is_valid():
obj_form.save()
html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/test/" method="post" novalidate>
{% csrf_token %}
<p>输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p>
<p>输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p>
<p>输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p>
<input type="submit" value="提交">
</form>
</body>
</html> 具体Form在前端展示以及校验方式、以及操作model的方式(增删改查)不展开,此处主要说明方式
三、Django使用插件modelForm表单操作数据库
和方法二的使用表单Form相比,modelForm具有Form中所有的验证钩子,使用django的modelForm表单不需要重新定义Form,比较方便。
缺点是和数据库model耦合性太强;
Model
class Article(models.Model):
title = models.CharField(max_length=20, unique=True)
author = models.ForeignKey('Author')
ModelForm
class ArticleForm(forms.ModelForm):
class Meta:
model = Article #对应的modelfields="__all__"#或('name','email','user_type') #验证哪些字段,"__all__"表示所有字段
exclude = None #排除的字段 labels = None #提示信息 help_texts = None #帮助提示信息 widgets = None #自定义插件 error_messages = None #自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS) field_classes = None #自定义字段类(也阔以自定义字段) localized_fields = () #本地化,根据settings中TIME_ZONE设置的不同时区显示时间def clean_username(self):
value = self.cleaned_data['username'] if value == 'root': return value else: raise ValidationError("你不是管理员!")View文件如下:
def test(request):
if request.method == 'GET':
obj =ArticleForm()
return render(request, 'test.html', {'obj': obj})
else:
form = ArticleForm(request.POST)
if obj.is_valid():
#验证合格,前端的数据保存在到数据库
form.save() #默认save(commit=True),默认保存多对多,当commit=False时可以拆分保存操作
return HttpResponse('提交成功')
html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/test/" method="post" novalidate>
{% csrf_token %}
<p>输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p>
<p>输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p>
<p>输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p>
<input type="submit" value="提交">
</form>
</body>
</html>
Django使用普通表单、Form、以及modelForm操作数据库方式总结的更多相关文章
- 第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...
- 关于Django中的表单验证
ModelForm 和 普通的Form 都可以做表单验证 对于ModelForm如果只是想验证其中一部分model中的field,可以指定:内部类Meta的fields元素: fields = ('x ...
- Django:提交表单时遇到403错误:CSRF verification failed
Django:提交表单时遇到403错误:CSRF verification failed 问题: 提交表单时遇到403错误:CSRF verification failed 解决方案: 在表单界面ht ...
- Django中的表单
目录 表单 Django中的表单 用表单验证数据 自定义验证 表单 HTML中的表单是用来提交数据给服务器的,不管后台服务器用的是 Django 还是 PHP还是JSP还是其他语言.只要把 inpu ...
- HTML ------ 关于表单 Form
Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...
- Bootstrap~表单Form
回到目录 在进行自己的后台改版时,大体布局都使用了bootstrap,剩下的表单部分没理由不去使用它,对于表单的美化和布局,bootstrap做的也是很不错的,有大气的边框,多功能的按钮及宏观的表单布 ...
- 表单 - Form - EasyUI提供的表单异步提交
方案一 被提交的表单 <form id="loginForm" method="post"> <table align="cente ...
- 跟服务器交互的Web表单(form)
使用HTML来构建可以跟服务器交互的Web表单(form),通过给你的form元素添加一个action属性来达到此目的. action属性的值指定了表单提交到服务器的地址. 例如: <form ...
- 3、网页制作Dreamweaver(表单form)
表单form (虚线不显示) 1.写法: <form id="form1" name="form1" method="post" ac ...
随机推荐
- 使用ExecutorService实现线程池
ExecutorService是java提供的用于管理线程池的类. 线程池的作用: - 控制线程数量 - 重用线程 当一个程序中创建了许多线程,并在任务结束后销毁,会给系统带来过度消耗资源,以及过度切 ...
- 【bzoj4817】[Sdoi2017]树点涂色 LCT+LCA+线段树
题目描述 给出一棵n个点,以1为根的有根树,每个点初始染有互不相同的颜色.定义一条路径的权值为路径上的颜色种类数.现有m次操作,每次操作为以下三种之一: 1 x: 把点x到根节点的路径上所有的点染上一 ...
- 51nod 1967路径定向(欧拉回路)
题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案. 首先假设是个无向图,不妨认定偶点必定可以满足条件 我们还会发现,奇点的个数必定是偶数个 那么如果把奇点两两用辅助边连起来, ...
- [bzoj4071] [Apio2015]巴邻旁之桥
Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...
- nowcoder 提高组模拟赛 选择题 解题报告
选择题 链接: https://www.nowcoder.com/acm/contest/178/B 来源:牛客网 题目描述 有一道选择题,有 \(a,b,c,d\) 四个选项. 现在有 \(n\) ...
- java过滤器和监听器详解
过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求 ...
- wait , notify 模拟 Queue
package com.itdoc.multi.sync009; import java.util.LinkedList; import java.util.concurrent.TimeUnit; ...
- 前端面试:提升web性能
1,减少HTTP请求数 A,从设计实现层简化页面 B,合理设置HTTP缓存 C,资源合并与压缩.如果可以的话,尽可能的将外部脚本,央视进行合并,多个合为一,css,javascript,image都可 ...
- 有关eclipse的内存溢出问题
一:前言 最近在做的项目在启动tomcat时就报“内存溢出的错误”,其实也不是自己第一次遇到,但是每次都是在网上查询后敲进去,所以这次我觉得自己记载下来吧. 二:内容 我自己的配置大小,这里的配置位置 ...
- SVG布局
http://www.w3cplus.com/html5/nesting-svgs.html