你如何使用Django URL名称空间?

Cha*_*ert 29 django django-urls

我正试图搞清楚Django URL名称空间.但我找不到任何示例或文档.

这是我尝试过的.

urls.py:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^foo/', include('sub_urls', namespace='foo', app_name='foo')),
    (r'^bar/', include('sub_urls', namespace='bar', app_name='bar')),            
)
Run Code Online (Sandbox Code Playgroud)

sub_urls.py:

from django.conf.urls.defaults import patterns, url
from views import view1

urlpatterns = patterns('views',
    url(r'^(?P<view_id>\d+)/$', view1, name='view1')
)
Run Code Online (Sandbox Code Playgroud)

views.py:

from django.shortcuts import render_to_response

def view1(request, view_id):
    return render_to_response('view1.html', locals())
Run Code Online (Sandbox Code Playgroud)

在view1.html中,{%url foo:view1 3%}输出/ foo/3,{%url bar:view1 3%}输出/ bar/3.无论我浏览到/ foo/X还是/ bar/X,都是如此.

我想要的是能够浏览到/ foo/X或/ bar/X,并且{%url view1 3%}分别输出/ foo/3或/ bar/3.

Tor*_*cht 6

似乎没有直接的方法来做到这一点.我会使用一个类似的解决方案,因为你使用模板标签,虽然我发现了一种更通用的方式.我使用了你可以在url conf中传递可选参数这一事实,因此你可以跟踪命名空间:

#urls.py
from django.conf.urls import defaults

urlpatterns = defaults.patterns('',
    defaults.url(r'^foo/', include('sub_urls', namespace='foo', app_name='myapp'), 
    kwargs={'namespace':'foo'}),
    defaults.url(r'^bar/', include('sub_urls', namespace='bar', app_name='myapp'),
    kwargs={'namespace':'bar'}),      
)
Run Code Online (Sandbox Code Playgroud)

这也违反了DRY原则,但不是很多:)

然后在您的视图中,您将获得命名空间变量(sub_urls.py将是相同的):

#views.py
from django import shortcuts

def myvew(request, namespace):
    context = dict(namespace=namespace)
    return shortcuts.render_to_response('mytemplate.html', context)
Run Code Online (Sandbox Code Playgroud)

稍后您只需要一个简单的标记,将命名空间变量和视图名称传递给:

#tags.py
from django import template
from django.core import urlresolvers

register = template.Library()

def namespace_url(namespace, view_name):
   return urlresolvers.reverse('%s:%s' % (namespace, view_name, args=args, kwargs=kwargs)))
register.simple_tag(namespace_url)
Run Code Online (Sandbox Code Playgroud)

并在模板中使用它(确保将视图名称作为字符串传递,而不是作为模板变量):

<!-- mytemplate.html -->
{% load tags %}
{% namespace_url namespace "view1"%}
Run Code Online (Sandbox Code Playgroud)

谢谢你的提示顺便说一下......我在寻找...... 像这样.


Mys*_*tic 3

我认为这在 django 现在是不可能的。请查看此留言板帖子,其中引用了票证 11559。我认为您正在尝试做同样的事情 - 有效地将隐式参数传递给 URL 标记。

另外,假设sub_urls两次都来自同一个应用程序,您应该确保这app_name两种情况都是相同的。您应该只需要更改名称空间。