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 ...
随机推荐
- BZOJ4584 APIO2016赛艇(动态规划+组合数学)
如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...
- [洛谷P1892]团伙
题目大意:有n个人,关系为:朋友的朋友是朋友,敌人的敌人是朋友.如果是朋友就在一个团队内,是敌人就不在,现在给出一关系,问最多有多少团伙.题解:并查集,建反集,如果是朋友,就把他们的并查集合并:如果是 ...
- 【BZOJ 4007】[JLOI2015]战争调度 DP+搜索+状压
又是一道思路清新的小清晰. 观察题目,如果我们确定了平民或者贵族的任意一方,我们便可以贪心的求出另一方,至此20分:我们发现层数十分小,那么我们就也是状压层数,用lca转移,线性dp,至此50分(好像 ...
- 使用JavaScript时要注意的7个要素
每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学 ...
- 从零开始学习MXnet(五)MXnet的黑科技之显存节省大法
写完发现名字有点拗口..- -# 大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉 ...
- barba.js 优化页面跳转用户体验
barba.js 原理就是在a页面中显示b页面的内容,样式为刷新,给用户以页面跳转后无刷新体验,注意样式命名,ab页面引用的样式和js要相同 可以在页面之间创建良好的转换,增强用户的体验. 减少HTT ...
- MySQL 8.0.11 中使用 grant ... identified by 时 error 1064 near 'identified by '密码'' at line 1
(1)问题: 当使用 grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码'; 时会出现"......near 'identifie ...
- Java并发编程--ThreadPoolExecutor
概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...
- SpringMVC异常报406 (Not Acceptable)的解决办法
使用SpsringMVC,使用restEasy调试,controller请求设置如下: @RequestMapping(value="/list",method=RequestMe ...
- 01-modal
Demo示例程序源代码
源代码下载链接:01-modal.zip37.8 KB // MJAppDelegate.h // // MJAppDelegate.h // 01-modal // // Created by ...