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实现strcmp函数功能示例
Mar 25 Python
如何搜索查找并解决Django相关的问题
Jun 30 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Python实现的简单计算器功能详解
Aug 25 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python+pyqt5编写md5生成器
Mar 18 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
详解Python3序列赋值、序列解包
May 14 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
Python数据库封装实现代码示例解析
Sep 05 Python
python爬取新闻门户网站的示例
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性能优化准备篇图解PEAR安装
2011/12/05 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
js实现随机点名
2021/01/19 Javascript
CentOS安装pillow报错的解决方法
2016/01/27 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
python远程邮件控制电脑升级版
2019/05/23 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
好家长事迹材料
2014/01/23 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
2015年组织部工作总结
2015/04/03 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js