Django使用普通表单、Form、以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样:

  1. 进入填写表单页面;
  2. 在表单页面填写信息,并提交;
  3. 表单数据验证
  4. 验证成功,和数据库进行交互(增删改查);
  5. 验证成功,页面提示表单填写失败;

一、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 #对应的model
fields = "__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操作数据库方式总结的更多相关文章

  1. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  2. 关于Django中的表单验证

    ModelForm 和 普通的Form 都可以做表单验证 对于ModelForm如果只是想验证其中一部分model中的field,可以指定:内部类Meta的fields元素: fields = ('x ...

  3. Django:提交表单时遇到403错误:CSRF verification failed

    Django:提交表单时遇到403错误:CSRF verification failed 问题: 提交表单时遇到403错误:CSRF verification failed 解决方案: 在表单界面ht ...

  4. Django中的表单

    目录 表单 Django中的表单 用表单验证数据 自定义验证 表单 HTML中的表单是用来提交数据给服务器的,不管后台服务器用的是 Django  还是 PHP还是JSP还是其他语言.只要把 inpu ...

  5. HTML ------ 关于表单 Form

    Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...

  6. Bootstrap~表单Form

    回到目录 在进行自己的后台改版时,大体布局都使用了bootstrap,剩下的表单部分没理由不去使用它,对于表单的美化和布局,bootstrap做的也是很不错的,有大气的边框,多功能的按钮及宏观的表单布 ...

  7. 表单 - Form - EasyUI提供的表单异步提交

    方案一 被提交的表单 <form id="loginForm" method="post"> <table align="cente ...

  8. 跟服务器交互的Web表单(form)

    使用HTML来构建可以跟服务器交互的Web表单(form),通过给你的form元素添加一个action属性来达到此目的. action属性的值指定了表单提交到服务器的地址. 例如: <form ...

  9. 3、网页制作Dreamweaver(表单form)

    表单form (虚线不显示) 1.写法: <form id="form1" name="form1" method="post" ac ...

随机推荐

  1. BZOJ4584 APIO2016赛艇(动态规划+组合数学)

    如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...

  2. [洛谷P1892]团伙

    题目大意:有n个人,关系为:朋友的朋友是朋友,敌人的敌人是朋友.如果是朋友就在一个团队内,是敌人就不在,现在给出一关系,问最多有多少团伙.题解:并查集,建反集,如果是朋友,就把他们的并查集合并:如果是 ...

  3. 【BZOJ 4007】[JLOI2015]战争调度 DP+搜索+状压

    又是一道思路清新的小清晰. 观察题目,如果我们确定了平民或者贵族的任意一方,我们便可以贪心的求出另一方,至此20分:我们发现层数十分小,那么我们就也是状压层数,用lca转移,线性dp,至此50分(好像 ...

  4. 使用JavaScript时要注意的7个要素

    每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学 ...

  5. 从零开始学习MXnet(五)MXnet的黑科技之显存节省大法

    写完发现名字有点拗口..- -# 大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉 ...

  6. barba.js 优化页面跳转用户体验

    barba.js 原理就是在a页面中显示b页面的内容,样式为刷新,给用户以页面跳转后无刷新体验,注意样式命名,ab页面引用的样式和js要相同 可以在页面之间创建良好的转换,增强用户的体验. 减少HTT ...

  7. MySQL 8.0.11 中使用 grant ... identified by 时 error 1064 near 'identified by '密码'' at line 1

    (1)问题:     当使用 grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码'; 时会出现"......near 'identifie ...

  8. Java并发编程--ThreadPoolExecutor

    概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...

  9. SpringMVC异常报406 (Not Acceptable)的解决办法

    使用SpsringMVC,使用restEasy调试,controller请求设置如下: @RequestMapping(value="/list",method=RequestMe ...

  10. 01-modal Demo示例程序源代码

    源代码下载链接:01-modal.zip37.8 KB // MJAppDelegate.h // //  MJAppDelegate.h //  01-modal // //  Created by ...