Django创建通用视图函数
想在我们有两个视图:

- def thinkingview(request):
- user = request.user
- if request.method == 'GET':
- return render(request, 'think.html', {'user': user})
- elif request.method == 'POST:
- user = request.user
- data_form = ThinkingForm(request.POST)
- if data_form.is_valid():
- data_form.save()
- return redirect('index')
- else:
- return render(request, 'think.html', {'user': user, 'error': data_form.errors})

- def questionview(request):
- user = request.user
- if request.method == 'GET':
- user = request.user
- return render(request, 'question.html', {'user': user})
- elif request.method == 'POST:
- data_form = QuestionForm(request.POST)
- if data_form.is_valid():
- data_form.save()
- return redirect('index')
- else:
- return render(request, 'question.html', {'user': user, 'error': data_form.errors})
这两个视图非常相似,GET渲染页面并预置用户信息,POST提交文本数据,不同的只有tamplate和form这两个对象。现在把这两个对象抽象出来,创建一个通用的视图:
- # view.py
- def reportview(request, tamplate_name, form):
- user = request.user
- if request.method == 'GET':
- user = request.user
- return render(request, tamplate_name, {'user': user})
- elif request.method == 'POST:
- data_form = form(request.POST)
- if data_form.is_valid():
- data_form.save()
- return redirect('index')
- else:
- return render(request, tamplate_name, {'user': user, 'error': data_form.errors})
通过URLconf的传递额外参数的方式来传递这两个对象:
- # urls.py
- from django.conf.urls import url
- from myapp import forms, views
- urlpatterns = [
- url(r'^thinking/$', views.report, {'tamplate_name': 'thinking.html', 'form': forms.ThinkingForm}),
- url(r'^question/$', view.report, {'tamplata_name': 'question.html', 'form': forms.QuestionForm})
这样就有了一个可复用的、与对象无关的视图(在URLconf中甚至可以传递model)!如果再有类似功能的视图时就可以重用这个report视图,而不需要再写视图代码。
现在来做一些优化,在同一个视图函数中对POST
和GET
进行处理是一种比较粗糙的做法,一个比较好的设计习惯应该是,用两个分开的视图函数——一个处理POST请求,另一个处理GET请求,然后在相应的地方分别进行调用。
写一个分发函数,由它来分派GET和POST请求:
- #views.py
- from django.views.decorators.http import require_http_methods
- ...
- def method_splitter(request, *args, **kwargs):
- #对http method进行分发
- get_view = kwargs.pop('get', None)
- post_view = kwargs.pop('post', None)
- if request.method == 'GET' and get_view is not None:
- return get_view(request, *args, **kwargs)
- elif request.method == 'POST' and post_view is not None:
- return post_view(request, *args, **kwargs)
- raise Http404
- @require_http_methods('GET')
- def report_get(request, tamplate_name):
- user = request.user
- return render(request, tamplate_name, {'user': user})
- @require_http_methods('POST')
- def report_post(request, tamplate_name, form):
- data_form = form(request.POST)
- if data_form.is_valid():
- data_form.save()
- return redirect('index')
- else:
- return render(request, tamplate_name, 'user': request.user, 'error': data_form.errors})
- #urls.py
- urlpatterns = [
- url(r'^thinking/$', views.report, {'tamplate_name': 'thinking.html', 'form': forms.ThinkingForm, 'get': view.report_get, 'post': view.report_post}),
- url(r'^question/$', view.report, {'tamplata_name': 'question.html', 'form': forms.QuestionForm, 'get': view.report_get, 'post': view.report_post})
现在我们就拥有了一个不错的,可以通用的视图函数了,里边封装着由request.method
的返回值来分派不同的视图的程序.
Django创建通用视图函数的更多相关文章
- Python学习---django重点之视图函数
django重点之视图函数 http请求中产生两个核心对象: http请求:HttpRequest对象,由Django自己创建 http响应:HttpResponse对象,由开发自己创建,必须返回一个 ...
- Python Django CBV下的通用视图函数
ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request): retu ...
- Django Views(视图函数)
http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpR ...
- Django之views视图函数
views视图函数属于MTV中逻辑处理的部分视图函数包含着两个对象,HttpRequest对象和HttpResponse对象 一.HttpRequest对象 HttpRequest对象在Django中 ...
- Django之通用视图
01-介绍 通用视图把视图开发中常用的写法和模式抽象出来,让你编写少量代码就能快速实现常见的数据视图.显示对象列表就是这样一种任务. Django 自带的通用视图能实现下述功能: 1.列出对象并显示单 ...
- Django 框架之视图函数(Views)
http请求中产生的两个核心对象: http请求: HttpRequest对象 http响应: HttpResponse对象 所在位置: django.http HttpRequest 对象的属性和方 ...
- django 类通用视图详解
view() : 该类为所有类视图的父类,处于最底层,仅仅只对请求参数做校验后,给特定请求方法做特定调用. 用法: url中定位到类方法:Aa.as_view() ——> View.as ...
- Django入门-通用视图
文档:https://docs.djangoproject.com/en/1.11/topics/class-based-views/ from django.shortcuts import get ...
- Django 1.6 基于类的通用视图
Django 1.6 基于类的通用视图 最初 django 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特 ...
随机推荐
- html5中的video标签和audio标签
不管是否承认,flash早已不像过往那样如日中天了.亚马逊全面放弃flash.苹果放弃flash.安卓也放弃了移动端的flash支持.事实上flash已经不太适合web开发了,因为HTML5中的vid ...
- Java 多线程(二) 线程的实现
线程的实现 在Java中通过run方法为线程指明要完成的任务,有两种技术来为线程提供run方法: 1.继承Thread类并重写它的run方法.之后创建这个子类的对象并调用start()方法. 2.通过 ...
- CentOS7中将home迁移到/下的命令
CentOS7中将home迁移到/下的命令
# mkdir -p /backup # cp -r /home/* /backup # umount /home # df -hl # fdisk -l # lvremove /dev/cento ...
- 201521123007《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.1有关继承的知识点: 1.2有关多态 多态性:相同的形态,不同的行为.体现在相同的方法名 ...
- 201521123029《Java程序设计》第四周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:1. 多态性,多态性是相同的形态,不同的行为(定义),其中父类类型变量可以引用子类对象. ...
- 201521123059 《Java程序设计》第三周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- JSP学习(一)之中文乱码问题的解决
一.响应中的乱码 我们所看到的页面,是由服务器把内容放入响应(response)中,然后发送给浏览器的.如果响应中的数据无法被正常解析,就会出现中文乱码.为什么英文不存在乱码问题?因为无论是ISO-8 ...
- 201521123072《java程序设计》第十周学习总结
201521123072<java程序设计>第十周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异 ...
- Java 第九周总结
1. 本周学习总结 2. 书面作业 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 以前的代码经常出现空指针的,需 ...
- java第十三次作业
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相内关容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...