利用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 正则表达式操作指南
May 04 Python
详细解读Python中解析XML数据的方法
Oct 15 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
元组列表字典(莫烦python基础)
Apr 03 Python
Python数据类型之Number数字操作实例详解
May 08 Python
numpy数组之存取文件的实现示例
May 24 Python
python的pytest框架之命令行参数详解(上)
Jun 27 Python
如何基于Python实现自动扫雷
Jan 06 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
基于Python实现射击小游戏的制作
Apr 06 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
ThinkPHP标签制作教程
2014/07/10 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
Python模拟随机游走图形效果示例
2018/02/06 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Python3内置模块random随机方法小结
2019/07/13 Python
QML用PathView实现轮播图
2020/06/03 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
Python Http请求json解析库用法解析
2020/11/28 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
人民教师的自我评价分享
2014/02/21 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
煤矿安全承诺书
2014/05/22 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
学校安全管理制度
2015/08/06 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书