利用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爬虫之神器正则表达式
Nov 06 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
代码讲解Python对Windows服务进行监控
Feb 11 Python
浅谈Python中重载isinstance继承关系的问题
May 04 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Python面向对象程序设计示例小结
Jan 30 Python
Python 控制终端输出文字的实例
Jul 12 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
PyQT5 emit 和 connect的用法详解
Dec 13 Python
pytorch常见的Tensor类型详解
Jan 15 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
Python模块zipfile原理及使用方法详解
Aug 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 安装方法
2006/10/09 PHP
PHP 常见郁闷问题答解
2006/11/25 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php密码生成类实例
2014/09/24 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
python正则表达式re模块详细介绍
2014/05/29 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
数学系个人求职信范文
2014/01/30 职场文书
家长对孩子的评语
2014/04/18 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
五一晚会主持词
2015/07/01 职场文书
社区结对共建协议书
2016/03/23 职场文书