利用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 18 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
Python实现pdf文档转txt的方法示例
Jan 19 Python
python正则表达式爬取猫眼电影top100
Feb 24 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
Python3 log10()函数简单用法
Feb 19 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
Python Django 前后端分离 API的方法
Aug 28 Python
python3 re返回形式总结
Nov 20 Python
python3判断IP地址的方法
Mar 04 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
精通php的十大要点(上)
2009/02/04 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
让焦点自动跳转
2006/07/01 Javascript
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
创意活动策划书
2014/01/15 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
洗发露广告词
2014/03/14 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python