Django中传递参数到URLconf的视图函数中的方法


Posted in Python onJuly 18, 2015

有时你会发现你写的视图函数是十分类似的,只有一点点的不同。 比如说,你有两个视图,它们的内容是一致的,除了它们所用的模板不太一样:

# urls.py

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
  (r'^foo/$', views.foo_view),
  (r'^bar/$', views.bar_view),
)

# views.py

from django.shortcuts import render_to_response
from mysite.models import MyModel

def foo_view(request):
  m_list = MyModel.objects.filter(is_new=True)
  return render_to_response('template1.html', {'m_list': m_list})

def bar_view(request):
  m_list = MyModel.objects.filter(is_new=True)
  return render_to_response('template2.html', {'m_list': m_list})

我们在这代码里面做了重复的工作,不够简练。 起初你可能会想,通过对两个URL都使用同样的视图,在URL中使用括号捕捉请求,然后在视图中检查并决定使用哪个模板来去除代码的冗余,就像这样:

# urls.py

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
  (r'^(foo)/$', views.foobar_view),
  (r'^(bar)/$', views.foobar_view),
)

# views.py

from django.shortcuts import render_to_response
from mysite.models import MyModel

def foobar_view(request, url):
  m_list = MyModel.objects.filter(is_new=True)
  if url == 'foo':
    template_name = 'template1.html'
  elif url == 'bar':
    template_name = 'template2.html'
  return render_to_response(template_name, {'m_list': m_list})

这种解决方案的问题还是老缺点,就是把你的URL耦合进你的代码里面了。 如果你打算把 /foo/ 改成 /fooey/ 的话,那么你就得记住要去改变视图里面的代码。

对一个可选URL配置参数的优雅解决方法: URLconf里面的每一个模式都可以包含第三个数据: 一个关键字参数的字典:

有了这个概念以后,我们就可以把我们现在的例子改写成这样:

# urls.py

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
  (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
  (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)

# views.py

from django.shortcuts import render_to_response
from mysite.models import MyModel

def foobar_view(request, template_name):
  m_list = MyModel.objects.filter(is_new=True)
  return render_to_response(template_name, {'m_list': m_list})

如你所见,这个例子中,URLconf指定了 template_name 。 而视图函数会把它当成另一个参数。

这种使用额外的URLconf参数的技术以最小的代价给你提供了向视图函数传递额外信息的一个好方法。

Python 相关文章推荐
Python中的pass语句使用方法讲解
May 14 Python
python 性能提升的几种方法
Jul 15 Python
Python中with及contextlib的用法详解
Jun 08 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
Python3实现定时任务的四种方式
Jun 03 Python
Python自定义一个异常类的方法
Jun 27 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
python新式类和经典类的区别实例分析
Mar 23 Python
Java多线程实现四种方式原理详解
Jun 02 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 Python
Python Django 后台管理之后台模型属性详解
Apr 25 Python
在Django的URLconf中使用命名组的方法
Jul 18 #Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 #Python
在Django的URLconf中进行函数导入的方法
Jul 18 #Python
在Django的form中使用CSS进行设计的方法
Jul 18 #Python
在Django的视图中使用form对象的方法
Jul 18 #Python
详解Django中的form库的使用
Jul 18 #Python
在Django框架中编写Contact表单的教程
Jul 17 #Python
You might like
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
React Router基础使用
2017/01/17 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
浅谈Python的异常处理
2016/06/19 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
瑜伽国际:Yoga International
2018/04/18 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
艺术学院毕业生自我评价
2014/03/02 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
行政经理岗位职责
2015/04/15 职场文书
初中家长意见
2015/06/03 职场文书
特种设备安全管理制度
2015/08/06 职场文书
区域销售大会开幕词
2016/03/04 职场文书
golang正则之命名分组方式
2021/04/25 Golang
Python+Appium实现自动抢微信红包
2021/05/21 Python