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中的Numpy入门教程
Apr 26 Python
python爬虫的工作原理
Mar 05 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
如何使用Python标准库进行性能测试
Jun 25 Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 Python
用Python解数独的方法示例
Oct 24 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
python中doctest库实例用法
Dec 31 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 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
帅气的琦玉老师
2020/03/02 日漫
PHP删除非空目录的函数代码小结
2013/02/28 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
python在windows下创建隐藏窗口子进程的方法
2015/06/04 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
大专毕业生简历的自我评价
2013/10/20 职场文书
大学毕业感言100字
2014/02/03 职场文书
化妆品促销方案
2014/02/24 职场文书
年终奖发放方案
2014/06/02 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
艺术节开幕词
2015/01/28 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL