利用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实现对excel进行数据剔除操作实例
Dec 07 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
pandas数据集的端到端处理
Feb 18 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
python中count函数简单的实例讲解
Feb 06 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
基于keras中的回调函数用法说明
Jun 17 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
Python控制鼠标键盘代码实例
Dec 08 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
php创建session的方法实例详解
2015/01/27 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
Javascript函数的参数
2015/07/16 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
如何在python中使用selenium的示例
2017/12/26 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
python字符串判断密码强弱
2020/03/18 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
信访工作者先进事迹
2014/01/17 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
大学军训的体会
2014/11/08 职场文书
业务员辞职信范文
2015/03/02 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
民间借贷借条范本
2015/05/25 职场文书
后天观后感
2015/06/08 职场文书
工作收入证明模板
2015/06/12 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python