利用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中列表(list)操作方法汇总
Aug 18 Python
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
Python合并字符串的3种方法
May 21 Python
python编码最佳实践之总结
Feb 14 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
python cv2截取不规则区域图片实例
Dec 21 Python
使用TFRecord存取多个数据案例
Feb 17 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边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
node实现分片下载的示例代码
2018/10/17 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
python实现的文件同步服务器实例
2015/06/02 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
python 日期排序的实例代码
2019/07/11 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
python序列类型种类详解
2020/02/26 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
市场营销毕业生自荐信
2013/11/23 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
文艺演出策划方案
2014/06/07 职场文书
同意迁入证明模板
2014/10/26 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
python内置进制转换函数的操作
2021/06/02 Python
Python3.10的一些新特性原理分析
2021/09/15 Python
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL