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 相关文章推荐
Django中几种重定向方法
Apr 28 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
Python 如何访问外围作用域中的变量
Sep 11 Python
Python中XlsxWriter模块简介与用法分析
Apr 24 Python
Python饼状图的绘制实例
Jan 15 Python
Django实现学员管理系统
Feb 26 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
python dumps和loads区别详解
Feb 04 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
python实现逻辑回归的示例
Oct 09 Python
Python可视化神器pyecharts之绘制地理图表练习
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下封装较好的数字分页方法
2010/11/23 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
python中的字典操作及字典函数
2018/01/03 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
幼儿园教师国培感言
2014/02/02 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python