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编写网页爬虫脚本并实现APScheduler调度
Jul 28 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
python一键升级所有pip package的方法
Jan 16 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
tensorflow常用函数API介绍
Apr 19 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 Python
pandas中DataFrame重置索引的几种方法
May 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
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python回调函数用法实例详解
2015/07/02 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
Python中的__slots__示例详解
2017/07/06 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
python实现视频压缩功能
2020/12/18 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
试述DBMS的主要功能
2016/11/13 面试题
宿舍打麻将检讨书
2014/01/24 职场文书
火车来了教学反思
2014/02/11 职场文书
计划生育责任书
2015/05/09 职场文书
驻村工作简报
2015/07/20 职场文书
家庭教育培训学习心得体会
2016/01/14 职场文书
z-index不起作用
2021/03/31 HTML / CSS
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python