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入门篇之面向对象
Oct 20 Python
Python验证码识别处理实例
Dec 28 Python
Python环境变量设置方法
Aug 28 Python
Python时间获取及转换知识汇总
Jan 11 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
python处理两种分隔符的数据集方法
Dec 12 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
Feb 14 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 Python
Python实现数据的序列化操作详解
Jul 07 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制作静态网站的模板框架(四)
2006/10/09 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
python list语法学习(带例子)
2013/11/01 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python科学计算之Pandas详解
2017/01/15 Python
使用tensorflow实现线性svm
2018/09/07 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
学习Python爬虫的几点建议
2020/08/05 Python
Python 实现微信自动回复的方法
2020/09/11 Python
意大利在线药房:Saninforma
2021/02/11 全球购物
汽车专业学生自我评价
2014/01/19 职场文书
小学生秋游活动方案
2014/02/23 职场文书
校企合作协议书
2014/04/16 职场文书
小露珠教学反思
2014/04/30 职场文书
财务部绩效考核方案
2014/05/04 职场文书
借款协议书
2014/09/16 职场文书
公司聚餐通知
2015/04/22 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
python编写五子棋游戏
2021/05/25 Python
redis实现共同好友的思路详解
2021/05/26 Redis
Python3 类型标注支持操作
2021/06/02 Python
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server