利用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实现的AES双向对称加密解密与用法分析
May 02 Python
对python3 urllib包与http包的使用详解
May 10 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
python 给图像添加透明度(alpha通道)
Apr 09 Python
浅谈Python中的字符串
Jun 10 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
详解python中的异常和文件读写
Jan 03 Python
Python 数据科学 Matplotlib图库详解
Jul 07 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执行sql语句的写法
2009/03/10 PHP
php array_map()数组函数使用说明
2011/07/12 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
php比较相似字符串的方法
2015/06/05 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
2016/09/21 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
django框架auth模块用法实例详解
2019/12/10 Python
pytorch 常用线性函数详解
2020/01/15 Python
简单了解python列表和元组的区别
2020/05/14 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
高中课程设置方案
2014/05/28 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
银行催款通知书
2015/04/17 职场文书
2015年统战工作总结
2015/05/19 职场文书
详解Python flask的前后端交互
2022/03/31 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python