Django中传递参数到URLconf的视图函数中的方法

作者:goldensun 时间:2021-09-16 23:46:33 

有时你会发现你写的视图函数是十分类似的,只有一点点的不同。 比如说,你有两个视图,它们的内容是一致的,除了它们所用的模板不太一样:


# 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参数的技术以最小的代价给你提供了向视图函数传递额外信息的一个好方法。

标签:Django,URLconf
0
投稿

猜你喜欢

  • 从mysql到oracle你必须了解的50件事儿

    2010-08-05 14:36:00
  • opencv实现简单人脸识别

    2021-08-26 07:49:06
  • ASP写的汉字转换为UTF-8的一段代码

    2009-07-05 18:49:00
  • php静态化页面 htaccess写法详解(htaccess怎么写?)

    2023-11-14 22:33:03
  • Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)

    2022-03-23 08:31:22
  • python多进程提取处理大量文本的关键词方法

    2022-02-17 13:07:36
  • ASP用户登录模块的设计源码

    2008-10-03 12:16:00
  • 强大的Perl正则表达式实例详解

    2023-08-09 11:12:33
  • Oracle三种上载文件技术

    2010-07-16 13:34:00
  • 谷歌浏览器Chrome的javascript引擎

    2008-09-04 12:24:00
  • Python监控服务器实用工具psutil使用解析

    2021-10-14 03:16:24
  • 巧用weui.topTips验证数据的实例

    2023-08-12 03:00:51
  • ASP中查询数据库记录写入XML文件示例

    2007-08-23 13:12:00
  • 请注意页面head区域的编码是不是规范

    2008-08-06 13:14:00
  • Python中pass的作用与使用教程

    2023-05-05 23:05:05
  • Javascript基础学习之十个重要问题

    2023-07-14 09:17:52
  • SQL的密码管理的六个危险判断

    2012-01-05 19:07:21
  • 有关于IE8 Beta 1两个提醒

    2008-05-15 12:32:00
  • 详解利用Python scipy.signal.filtfilt() 实现信号滤波

    2022-09-23 21:23:03
  • SQL学习笔记五去重,给新加字段赋值的方法

    2011-09-30 11:53:28
  • asp之家 网络编程 m.aspxhome.com