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脚本
Sep 01 Python
Python set集合类型操作总结
Nov 07 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
python字符串的方法与操作大全
Jan 30 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
python通过tcp发送xml报文的方法
Dec 28 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
Python实现Wordcloud生成词云图的示例
Mar 30 Python
Django实现列表页商品数据返回教程
Apr 03 Python
Python collections模块的使用方法
Oct 09 Python
关于python中readlines函数的参数hint的相关知识总结
Jun 24 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
python属于解释型语言么
2020/06/15 Python
毕业学生推荐信
2013/12/01 职场文书
初一科学教学反思
2014/01/27 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
音乐节策划方案
2014/06/09 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
小学德育工作总结2015
2015/05/12 职场文书