上一篇我们写了Django基于类如何增删改数据的方法,方法虽然简单,但新手可能对其原理不是很清楚,那么我们这次就用Django提供的ModelForm方法来实现增删改数据,这是一种基于现有模型的增删改方法。

一个简单的例子加以说明,前提是你已经具备Django创建项目应用的基本知识:
01.首先创建一个简单的模型,模型只有三个文本字段,标题title, 内容text , 添加日期date_added,如下:

# models.py

from django.db import models
from django.utils import timezone class Article(models.Model):
title = models.CharField('标题', max_length=100)
text = models.TextField('内容')
date_added = models.DateTimeField(default=timezone.now) def __str__(self):
return self.title

创建完模型别忘了生成数据库,makemigrations方法(生成迁移文件),migrate(迁移到数据库) 。

02.在项目中创建一个form.py的文件,我这里的项目名称是app1,在其中创建继承一个ModelForm的表单类ArticleForm,他的子类中包含很多内置的方法,我都都可以对其覆盖,有兴趣的同学可以看官方文档,讲的非常详细。
文档地址:https://docs.djangoproject.com/zh-hans/2.1/topics/forms/modelforms/#django.forms.ModelForm

# form.py

from django.forms import ModelForm
from .models import Article class ArticleForm(ModelForm): # 继承ModelForm类
class Meta:
model = Article # 具体要操作那个模型
fields = ['title', 'text', 'date_added'] # 允许编辑的字段

03.创建我们视图函数,开始增删改

# views.py

from django.shortcuts import render, redirect
from .models import Article
from .form import ArticleForm def articles(request):
# 查询列表页面,获取Article的所有信息
articles = Article.objects.all()
return render(request, 'app1/articles.html', {'articles':articles})
# 与其对应的url,在应用中的urls.py中设置
path('article/', views.articles, name='article'),
# 添加页面
def new_article(request):
# 如果不是POST方法访问
if request.method != 'POST':
# 创建一个空表单在页面显示
form = ArticleForm()
else:
# 否则为POST方式
# request.POST方法,将会获取到表单中我们输入的数据
new_article = ArticleForm(request.POST)
# 验证其合法性,使用is_valid()方法
if new_article.is_valid():
# 验证通过,使用save()方法保存数据
new_article.save()
# 保存成功,使用redirect()跳转到指定页面
return redirect('app1:article')
return render(request, 'app1/new_article.html', {'form':form})
# 编辑修改页面
def edit_article(request, article_id):
# 查询到指定的数据
article = Article.objects.get(id=article_id)
if request.method != 'POST':
# 如果不是post,创建一个表单,并用instance=article当前数据填充表单
form = ArticleForm(instance=article)
else:
# 如果是post,instance=article当前数据填充表单,并用data=request.POST获取到表单里的内容
form = ArticleForm(instance=article, data=request.POST)
form.save() # 保存
if form.is_valid(): # 验证
return redirect('app1:article') # 成功跳转
return render(request, 'app1/edit_article.html', {'form':form,'article':article})
# 删除页面
def del_article(request, article_id):
article = Article.objects.get(id=article_id)
if request.method == 'POST':
article.delete()
return redirect('app1:article')
return render(request, 'app1/del_article.html', {'article': article})

05.设置所有视图的url

# 列表
path('article/', views.articles, name='article'),
# 添加
path('new_article/', views.new_article, name='new_article'),
# 修改
path('edit_article/<int:article_id>/', views.edit_article, name='edit_article'),
# 删除
path('del_article/<int:article_id>/', views.del_article, name='del_article'),

06.静态页面调用

# articles.html

 <a href="{% url 'app1:new_article' %}">添加</a>
{% for article in articles %}
<h1>{{ article.title }}</h1>
<p>{{ article.text }}</p>
<a href="{% url 'app1:edit_article' article.id %}">修改</a>
<a href="{% url 'app1:del_article' article.id %}">删除</a>
{% endfor %} # new_article.html
<form action="{% url 'app1:new_article' %}" method="post">
{% csrf_token %}
{{ form.as_ul }}
<input type="submit" value="提交">
</form>

07.其他两个修改和删除页面的模板中调用方法与new_article.html中的方法一样,只需要更换action中的url即可。

创作不易,我会持续分享关于Django的相关知识,有兴趣的朋友可以关注本人微信公众号:幸福关中, 如果您觉得不错的话,打赏以下小编,小编会更有动力分享更多关于Django方面的知识,欢迎大家加小编微信交流Django知识,备注Django,小编微信:xingfuguanzhong

利用Django提供的ModelForm增删改数据的更多相关文章

  1. Django基于类的增删改查,简单逻辑都不用写

    Django是Python中一个非常牛逼的web框架,他帮我们做了很多事,里边也提前封装了很多牛逼的功能,用起来简直不要太爽,在写网站的过程中,增删改查这几个基本的功能我们是经常会用到,Django把 ...

  2. Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)

    接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1.首先项目图: 2.这里的布局文件activity_main.xml: <LinearLayout xmlns:android ...

  3. C#利用WinForm调用WebServices实现增删改查

    实习导师要求做一个项目,用Winform调用WebServices实现增删改查的功能.写下这篇博客,当做是这个项目的总结.如果您有什么建议,可以给我留言.欢迎指正. 1.首先,我接到这个项目的时候,根 ...

  4. vue实战(一):利用vue与ajax实现增删改查

    vue实战(一):利用vue与ajax实现增删改查: <%@ page pageEncoding="UTF-8" language="java" %> ...

  5. Android(java)学习笔记136:利用谷歌API对数据库增删改查(推荐使用)

    接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1. 首先项目图: 2. 这里的布局文件activity_main.xml: <LinearLayout xmlns:andro ...

  6. Mysq基础l数据库管理、表管理、增删改数据整理

    一.       数据库管理: 创建数据库: create database(自定义) 查询所有数据库: show databases;(查询所有数据库) show create database ( ...

  7. python入门23 pymssql模块(python连接sql server增删改数据 )

    增删改数据必须connect.commit()才会生效 回滚函数 connect.rollback() 连接数据库 ''' dinghanhua sql server增删改 ''' import py ...

  8. Python学习---django之ORM的增删改查180125

    模型常用的字段类型参数 <1> CharField        #字符串字段, 用于较短的字符串.        #CharField 要求必须有一个参数 maxlength, 用于从数 ...

  9. django -- ORM实现作者增删改查

    前戏 前面我们已经实现了出版社的增删改查,书的增删改查,书和出版社的对应关系.现在来写一下作者的增删改查和书的对应关系,那书和作者有什么关系呢?一个作者可以写多本书,一本书可以有多个作者,所以书和作者 ...

随机推荐

  1. java编程如何实现2017-01-16 22:28:26.0这样的时间数据,转换成2017:01:16:22:28:26这样的时间数据

    不多说,直接上干货! timereplace.java package zhouls.bigdata.DataFeatureSelection.util; /* * 这个程序,是用来做补充的 */ p ...

  2. android 开发-(Contextual Menu)上下文菜单的实现

    在android3.0以后,安卓设备不在提供物理的菜单按键,同时,android应用提供了另外的菜单实现机制,来替代之前的菜单创建方式.安卓设备中,平常可以使用长按住某个内容弹出菜单选项.这就是我们需 ...

  3. Unity GL 画圆

    Unity下GL没有画圆的函数,只能自己来了. 如果能帮到大家,我也很高兴. 虽然没有画圆的函数,但是能画直线,利用这一点,配合微积分什么的,就可以画出来了.反正就是花很多连在一起的直线,每条直线足够 ...

  4. 性能测试学习第九天_脚本编写以及controller场景

    创建java脚本 环境配置: 安装jdk(lr11最高支持java1.6) 配置环境变量 在lr选择java Vuser协议 脚本结构: 一般在init中编写初始化脚本,在action中编写业务流程, ...

  5. asp.net5开发中DNX SDK版本的影响

    某次asp.net5开发中遇到了一个很奇怪的问题,引用部分的nuget包没有显示任何错误,如下图: 但是编译时出现了几百个错误: 错误基本都是形如“CS0246 The type or namespa ...

  6. springboot 学习笔记(八)

    springboot整合activemq,实现queue,topic同时支持 1.JMS中定义了两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subs ...

  7. 日常bug整理--xxtz

    2017-12-12 建SQLite数据库表时,遇到外键关联报错:foreign key mismatch 解决:发现是个粗心问题,关联的外键没有作为主键,原因是关联的外键由INT改为varchar字 ...

  8. Hyper-V 2016 配置管理系列(部署篇)

    Hyper主机前提准备以后,我们开始Hyper-V Cluster 群集配置 准备验证Cluster 群集 : 1)打开群集管理器,点击"validate Configuration&quo ...

  9. c++ STL stack容器成员函数

    这是后进先出的栈,成员函数比较简单,因为只能操作栈顶的元素.不提供清除什么的函数. 函数 描述 bool s.empty() 栈是否为空(即size=0).若空,返回true,否则,false. vo ...

  10. java Vamei快速教程11 对象引用

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式.这方面的 ...