利用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的Django框架来制作一个RSS阅读器
Jul 22 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
Python内置函数delattr的具体用法
Nov 23 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
python制作填词游戏步骤详解
May 05 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
python cv2截取不规则区域图片实例
Dec 21 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
解决Keras中CNN输入维度报错问题
Jun 29 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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
PHP 程序员的调试技术小结
2009/11/15 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
python 内置函数filter
2017/06/01 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
Python多进程编程常用方法解析
2020/03/26 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
普天C++笔试题
2016/03/20 面试题
师范毕业生自荐信
2013/10/17 职场文书
物业客服专员岗位职责
2013/11/30 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
应用数学专业求职信
2014/03/14 职场文书
整改报告怎么写
2014/11/06 职场文书
安全隐患整改报告
2014/11/06 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python