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实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
Python的collections模块中的OrderedDict有序字典
Jul 07 Python
Python 模拟登陆的两种实现方法
Aug 10 Python
django定期执行任务(实例讲解)
Nov 03 Python
python中int与str互转方法
Jul 02 Python
python实现朴素贝叶斯算法
Nov 19 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
Python实现使用dir获取类的方法列表
Dec 24 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
用Python生成HTML表格的方法示例
Mar 06 Python
Python实现封装打包自己写的代码,被python import
Jul 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
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
Yii2 RESTful中api的使用及开发实例详解
2016/07/06 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
Python 调用Java实例详解
2017/06/02 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Django实现分页功能
2018/07/02 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
Linux的主要特性
2014/10/06 面试题
移交协议书
2014/08/19 职场文书
安全生产月宣传标语
2014/10/06 职场文书
Python 中random 库的详细使用
2021/06/03 Python
Java后台生成图片的完整步骤
2021/08/04 Java/Android
Spring Boot 实现 WebSocket
2022/04/30 Java/Android