利用Django提供的ModelForm增删改数据的方法


Posted in Python onJanuary 06, 2019

上一篇我们写了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' %}" rel="external nofollow" >添加</a>
  {% for article in articles %}
    <h1>{{ article.title }}</h1>
    <p>{{ article.text }}</p>
    <a href="{% url 'app1:edit_article' article.id %}" rel="external nofollow" >修改</a>
    <a href="{% url 'app1:del_article' article.id %}" rel="external nofollow" >删除</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 即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python用字典统计单词或汉字词个数示例
Apr 22 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
Python实现打印实心和空心菱形
Nov 23 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
PYcharm 激活方法(推荐)
Mar 23 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
python中把元组转换为namedtuple方法
Dec 09 Python
Python一行代码实现自动发邮件功能
May 30 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 #Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 #Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 #Python
Python3爬虫全国地址信息
Jan 05 #Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 #Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 #Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 #Python
You might like
PHP初学入门
2006/11/19 PHP
PHP安全性漫谈
2012/06/28 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
extJs 下拉框联动实现代码
2010/04/09 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
四年级数学教学反思
2014/02/02 职场文书
超市促销活动方案
2014/03/05 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
内勤岗位职责
2015/02/10 职场文书
世界气象日活动总结
2015/02/27 职场文书
家属联谊会致辞
2015/07/31 职场文书