想在我们有两个视图:

  1. def thinkingview(request):
  2. user = request.user
  3. if request.method == 'GET':
  4. return render(request, 'think.html', {'user': user})
  5. elif request.method == 'POST:
  6. user = request.user
  7. data_form = ThinkingForm(request.POST)
  8. if data_form.is_valid():
  9. data_form.save()
  10. return redirect('index')
  11. else:
  12. return render(request, 'think.html', {'user': user, 'error': data_form.errors})
  1. def questionview(request):
  2. user = request.user
  3. if request.method == 'GET':
  4. user = request.user
  5. return render(request, 'question.html', {'user': user})
  6. elif request.method == 'POST:
  7. data_form = QuestionForm(request.POST)
  8. if data_form.is_valid():
  9. data_form.save()
  10. return redirect('index')
  11. else:
  12. return render(request, 'question.html', {'user': user, 'error': data_form.errors})

这两个视图非常相似,GET渲染页面并预置用户信息,POST提交文本数据,不同的只有tamplate和form这两个对象。现在把这两个对象抽象出来,创建一个通用的视图:

  1. # view.py
  2. def reportview(request, tamplate_name, form):
  3. user = request.user
  4. if request.method == 'GET':
  5. user = request.user
  6. return render(request, tamplate_name, {'user': user})
  7. elif request.method == 'POST:
  8. data_form = form(request.POST)
  9. if data_form.is_valid():
  10. data_form.save()
  11. return redirect('index')
  12. else:
  13. return render(request, tamplate_name, {'user': user, 'error': data_form.errors})

通过URLconf的传递额外参数的方式来传递这两个对象:

  1. # urls.py
  2. from django.conf.urls import url
  3. from myapp import forms, views
  4.  
  5. urlpatterns = [
  6. url(r'^thinking/$', views.report, {'tamplate_name': 'thinking.html', 'form': forms.ThinkingForm}),
  7. url(r'^question/$', view.report, {'tamplata_name': 'question.html', 'form': forms.QuestionForm})

这样就有了一个可复用的、与对象无关的视图(在URLconf中甚至可以传递model)!如果再有类似功能的视图时就可以重用这个report视图,而不需要再写视图代码。

现在来做一些优化,在同一个视图函数中对POST 和GET 进行处理是一种比较粗糙的做法,一个比较好的设计习惯应该是,用两个分开的视图函数——一个处理POST请求,另一个处理GET请求,然后在相应的地方分别进行调用。
写一个分发函数,由它来分派GET和POST请求:

  1. #views.py
  2. from django.views.decorators.http import require_http_methods
  3. ...
  4.  
  5. def method_splitter(request, *args, **kwargs):
  6. #对http method进行分发
  7. get_view = kwargs.pop('get', None)
  8. post_view = kwargs.pop('post', None)
  9. if request.method == 'GET' and get_view is not None:
  10. return get_view(request, *args, **kwargs)
  11. elif request.method == 'POST' and post_view is not None:
  12. return post_view(request, *args, **kwargs)
  13. raise Http404
  14.  
  15. @require_http_methods('GET')
  16. def report_get(request, tamplate_name):
  17. user = request.user
  18. return render(request, tamplate_name, {'user': user})
  19.  
  20. @require_http_methods('POST')
  21. def report_post(request, tamplate_name, form):
  22. data_form = form(request.POST)
  23. if data_form.is_valid():
  24. data_form.save()
  25. return redirect('index')
  26. else:
  27. return render(request, tamplate_name, 'user': request.user, 'error': data_form.errors})
  28.  
  29. #urls.py
  30. urlpatterns = [
  31. url(r'^thinking/$', views.report, {'tamplate_name': 'thinking.html', 'form': forms.ThinkingForm, 'get': view.report_get, 'post': view.report_post}),
  32. url(r'^question/$', view.report, {'tamplata_name': 'question.html', 'form': forms.QuestionForm, 'get': view.report_get, 'post': view.report_post})

现在我们就拥有了一个不错的,可以通用的视图函数了,里边封装着由request.method 的返回值来分派不同的视图的程序.

Django创建通用视图函数的更多相关文章

  1. Python学习---django重点之视图函数

    django重点之视图函数 http请求中产生两个核心对象: http请求:HttpRequest对象,由Django自己创建 http响应:HttpResponse对象,由开发自己创建,必须返回一个 ...

  2. Python Django CBV下的通用视图函数

    ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request): retu ...

  3. Django Views(视图函数)

    http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpR ...

  4. Django之views视图函数

    views视图函数属于MTV中逻辑处理的部分视图函数包含着两个对象,HttpRequest对象和HttpResponse对象 一.HttpRequest对象 HttpRequest对象在Django中 ...

  5. Django之通用视图

    01-介绍 通用视图把视图开发中常用的写法和模式抽象出来,让你编写少量代码就能快速实现常见的数据视图.显示对象列表就是这样一种任务. Django 自带的通用视图能实现下述功能: 1.列出对象并显示单 ...

  6. Django 框架之视图函数(Views)

    http请求中产生的两个核心对象: http请求: HttpRequest对象 http响应: HttpResponse对象 所在位置: django.http HttpRequest 对象的属性和方 ...

  7. django 类通用视图详解

    view() :     该类为所有类视图的父类,处于最底层,仅仅只对请求参数做校验后,给特定请求方法做特定调用. 用法: url中定位到类方法:Aa.as_view() ——> View.as ...

  8. Django入门-通用视图

    文档:https://docs.djangoproject.com/en/1.11/topics/class-based-views/ from django.shortcuts import get ...

  9. Django 1.6 基于类的通用视图

    Django 1.6 基于类的通用视图 最初 django 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特 ...

随机推荐

  1. html5中的video标签和audio标签

    不管是否承认,flash早已不像过往那样如日中天了.亚马逊全面放弃flash.苹果放弃flash.安卓也放弃了移动端的flash支持.事实上flash已经不太适合web开发了,因为HTML5中的vid ...

  2. Java 多线程(二) 线程的实现

    线程的实现 在Java中通过run方法为线程指明要完成的任务,有两种技术来为线程提供run方法: 1.继承Thread类并重写它的run方法.之后创建这个子类的对象并调用start()方法. 2.通过 ...

  3. CentOS7中将home迁移到/下的命令 CentOS7中将home迁移到/下的命令

    # mkdir -p /backup # cp -r /home/* /backup # umount /home #  df -hl # fdisk -l # lvremove /dev/cento ...

  4. 201521123007《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.1有关继承的知识点: 1.2有关多态 多态性:相同的形态,不同的行为.体现在相同的方法名 ...

  5. 201521123029《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:1. 多态性,多态性是相同的形态,不同的行为(定义),其中父类类型变量可以引用子类对象. ...

  6. 201521123059 《Java程序设计》第三周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  7. JSP学习(一)之中文乱码问题的解决

    一.响应中的乱码 我们所看到的页面,是由服务器把内容放入响应(response)中,然后发送给浏览器的.如果响应中的数据无法被正常解析,就会出现中文乱码.为什么英文不存在乱码问题?因为无论是ISO-8 ...

  8. 201521123072《java程序设计》第十周学习总结

    201521123072<java程序设计>第十周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异 ...

  9. Java 第九周总结

    1. 本周学习总结 2. 书面作业 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 以前的代码经常出现空指针的,需 ...

  10. java第十三次作业

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相内关容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...