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获取脚本所在目录的正确方法
Apr 15 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
Python 将Matrix、Dict保存到文件的方法
Oct 30 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
python实现维吉尼亚算法
Mar 20 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
python绘制多个子图的实例
Jul 07 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
Sep 23 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 Python
Python eval函数介绍及用法
Nov 09 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
计数器详细设计
2006/10/09 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python字典操作简明总结
2015/04/13 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
使用requests库制作Python爬虫
2018/03/25 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
python实现一个简单的ping工具方法
2019/01/31 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
pandas计数 value_counts()的使用
2019/06/24 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
Django实现文件上传和下载功能
2019/10/06 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
公司活动总结范文
2014/07/01 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书