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 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特 ...
随机推荐
- 转:【Java并发编程】之七:使用synchronized获取互斥锁的几点说明
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17199201 在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访 ...
- 【1414软工助教】团队作业8——第二次项目冲刺(Beta阶段) 得分榜
题目 团队作业8--第二次项目冲刺(Beta阶段) 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析&a ...
- Swing-BoxLayout用法-入门
注:本文内容源于http://www.java3z.com/cwbwebhome/article/article20/200016.html?id=4797:细节内容根据笔者理解有修改. BoxLay ...
- Java程序设计第四周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:①String类是final类,不能定义String的子类. ② instanceof ...
- 201521123044 《Java程序设计》第2周作业-Java基本语法与类库
1. 本章学习总结 ·1.浮点型的不精确,不能简单的像C语言一样用float或者double来定义.在java中有更精确的BigDecimal类. 举例:BigDecimal bd1= new Big ...
- 201521123018 《Java程序设计》第1周学习总结
1. 本章学习总结 *Java程序的特点 *可以跨平台运行 *语言简单 *利用控制台运行java程序 *cmd调出控制台->用javac指令编译源代码->用java指令运行 2. 书面作业 ...
- 静态include与动态include的区别
jsp中的include有两种形式,分别是:<%@ include file=""%><jsp:include page="" flush=& ...
- 我的Emacs配置文件
(custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you co ...
- 火狐html5拖拽 弹出新页面解决办法
今天做项目时,需要实现一个拖拽排序的功能,遂想到了html5的拖拽,便开始查资料,写代码.功夫不复有心人,通过网上资料作参考,排序功能成功实现.谷歌浏览器测试,拖拽平滑,无问题.火狐浏览器测试时,却无 ...
- LINUX - awk命令之NF和$NF区别 (转)
NF和$NF 区别问答:(转)1.awk中$NF是什么意思?#pwd/usr/local/etc~# echo $PWD | awk -F/ '{print $NF}'etcNF代表:浏览记录的域的个 ...