当前位置: 首页 > 编程笔记 >

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

谷梁浩思
2023-03-14
本文向大家介绍Django中传递参数到URLconf的视图函数中的方法,包括了Django中传递参数到URLconf的视图函数中的方法的使用技巧和注意事项,需要的朋友参考一下

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

# 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 框架中推荐使用一个单独的 python 模块配置 URL 和视图函数或者视图类的映射关系,通常称这个配置模块为 URLconf,该 Python 模块通常命名为 urls.py。一般而言,每个应用目录下都会有一个 urls.py 文件,总的映射关系入口在项目目录下的 urls.py 中,而这个位置又是在 settings.py 文件中指定的。 本小节中将会学习 Django 中的路由

  • 本文向大家介绍Django的URLconf中使用缺省视图参数的方法,包括了Django的URLconf中使用缺省视图参数的方法的使用技巧和注意事项,需要的朋友参考一下 一个方便的特性是你可以给一个视图指定默认的参数。 这样,当没有给这个参数赋值的时候将会使用默认的值。 例子: 在这里,两个URL表达式都指向了同一个视图 views.page ,但是第一个表达式没有传递任何参数。 如果匹配到了第一个

  • 本文向大家介绍在Django的URLconf中进行函数导入的方法,包括了在Django的URLconf中进行函数导入的方法的使用技巧和注意事项,需要的朋友参考一下 看下这个 URLconf: 在 URLconf 中的每一个入口包括了它所关联的视图函数,直接传入了一个函数对象。 这就意味着需要在模块开始处导入视图函数。 但随着 Django 应用变得复杂,它的 URLconf 也在增长,并且维护这些

  • 在模板中,我有一些这样的代码: 这是“脚本”部分: 我想为选定的学生添加一些新课程,为了做到这一点,我创建了获取课程ID号和课程分数的表单。首先,当我填写表单时,当我点击“添加”按钮时,javascript创建表格,我可以添加许多课程,然后当我应该提交它以在视图部分执行其他步骤并将所有课程保存在数据库中时。我有一些问题,如果有人帮助我,我很高兴。 1)如何将“stock”数组(javaScript

  • 我尝试在Scala中实现一个StateMachine,但是我遇到了一个关于类型系统的问题,这让我相当困惑。在下面的代码中,我需要让guard函数接受StateMachine的预期子类的参数。不幸的是,由于FunctionN参数的类型参数是逆变的,我不确定如何完成此操作。

  • 本文向大家介绍在Django中创建URLconf相关的通用视图的方法,包括了在Django中创建URLconf相关的通用视图的方法的使用技巧和注意事项,需要的朋友参考一下 抽取出我们代码中共性的东西是一个很好的编程习惯。 比如,像以下的两个Python函数: 我们可以把问候语提取出来变成一个参数: 通过使用额外的URLconf参数,你可以把同样的思想应用到Django的视图中。 了解这个以后,你可