利用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学习RabbitMQ消息队列
Nov 30 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
Python Json序列化与反序列化的示例
Jan 31 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
python,Django实现的淘宝客登录功能示例
Jun 12 Python
python识别图像并提取文字的实现方法
Jun 28 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
python实现简易名片管理系统
Apr 11 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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
[转]JS宝典学习笔记
2007/02/07 Javascript
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
给Function做的OOP扩展
2009/05/07 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
Python格式化css文件的方法
2015/03/10 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python中的变量和作用域详解
2016/07/13 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
python正则表达式re之compile函数解析
2017/10/25 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
Python paramiko模块使用解析(实现ssh)
2019/08/30 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
某集团股份有限公司委托书样本
2014/09/24 职场文书
销售人才自我评价范文
2014/09/27 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
班主任2015新年寄语
2014/12/08 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript
Python+Appium实现自动抢微信红包
2021/05/21 Python
对PyTorch中inplace字段的全面理解
2021/05/22 Python
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
python中的getter与setter你了解吗
2022/03/24 Python