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中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
Python新手们容易犯的几个错误总结
Apr 01 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
Apr 19 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
Python Sqlalchemy如何实现select for update
Oct 12 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面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
JS 统计时间
2021/03/09 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
python中实现数组和列表读取一列的方法
2018/04/03 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
为什么是 Python -m
2020/06/19 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
C#和SQL Server的面试题
2016/08/12 面试题
见习期自我鉴定
2013/11/07 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
2014年科技工作总结
2014/11/26 职场文书
事业单位考察材料范文
2014/12/25 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python