利用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避免死锁方法实例分析
Jun 04 Python
Python中unittest模块做UT(单元测试)使用实例
Jun 12 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
详解python实现线程安全的单例模式
Mar 05 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
Python基于stuck实现scoket文件传输
Apr 02 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
在django中form的label和verbose name的区别说明
May 20 Python
浅谈python出错时traceback的解读
Jul 15 Python
Python如何操作docker redis过程解析
Aug 10 Python
教你漂亮打印Pandas DataFrames和Series
May 29 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中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
php函数与传递参数实例分析
2014/11/15 PHP
php强制运行广告的方法
2014/12/01 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
python 的列表遍历删除实现代码
2020/04/12 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
学生期末评语大全
2014/04/30 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
硕士论文致谢范文
2015/05/14 职场文书
催款函范本大全
2015/06/24 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python