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 相关文章推荐
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
Python科学计算之NumPy入门教程
Jan 15 Python
python并发2之使用asyncio处理并发
Dec 21 Python
python创建列表和向列表添加元素的实现方法
Dec 25 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
python中import与from方法总结(推荐)
Mar 21 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
python中@property和property函数常见使用方法示例
Oct 21 Python
python将三维数组展开成二维数组的实现
Nov 30 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
Python 发送邮件方法总结
Aug 10 Python
Python 内置函数速查表一览
Jun 02 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
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
降低PHP Redis内存占用
2017/03/23 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
php适配器模式简单应用示例
2019/10/23 PHP
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
2020/12/13 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Python多线程下载文件的方法
2015/07/10 Python
浅谈Python的异常处理
2016/06/19 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
Python如何转换字符串大小写
2020/06/04 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
abstract class和interface有什么区别
2013/08/04 面试题
2014酒店客房部工作总结
2014/12/16 职场文书
计算机实训心得体会
2016/01/14 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers