我正在尝试创建一个由多个应用多次使用的博客应用。但是,url templatetag和视图中的反向调用都不会根据current_app名称空间实例生成正确的url。
我正在使用Django 1.5.1
myproject / urls.py(请注意,test1,test2和test3是不同的应用程序)
urlpatterns = patterns('',
url(r'^test1/', include('test1.urls', namespace='test1', app_name='section')),
url(r'^test2/', include('test2.urls', namespace='test2', app_name='section')),
url(r'^test3/', include('test3.urls', namespace='test3', app_name='section')),
)
test1 / urls.py(和test2和test3相同)
urlpatterns = patterns('test1',
url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')),
url(r'^articles/', include('blog.urls', namespace='articles', app_name='blog')),
)
博客/ urls.py
urlpatterns = patterns('blog',
...
url(r'^new/$', blog_new, name='new'),
url(r'^new/preview$', blog_preview, name='new_preview'),
...
)
博客/ views.py
def blog_new(request, *args, **kwargs):
...
r = resolve(request.path)
context = {
...
'current_namespace': r.namespace,
'preview_url': reverse('section:blog:new_preview',
current_app=r.namespace)
...
}
return render(request, template_name, context, current_app=r.namespace)
另外,在_sidebar_menu.html
中<a href="{% url 'section:blog:new_preview' %}">
当我导航到以下任何一项时:
/ TEST1 /博客/新
/ TEST1 /物品/新
/ TEST2 /博客/新
/ TEST2 /物品/新
/ TEST3 /博客/新
/ TEST3 /物品/新
对于“preview_url”上下文变量和锚标记中的href,我总是得到相同的结果 - “test1 / blog / new / preview”。然而,上下文变量“current_namespace”包含预期的准确值。
我把头发拉出来了!我如何实现我追求的模块化?答案 0 :(得分:2)
我为所有感兴趣的人提供了成功的工作。
对于我在开场问题中列出的blog_new视图功能,可以通过执行以下操作获取所需的preview_url:
def blog_new(request, *args, **kwargs):
...
r = resolve(request.path)
context = {
...
'current_namespace': r.namespace,
'preview_url': reverse(r.namespace + ':new_preview')
...
}
return render(request, template_name, context, current_app=r.namespace)
注意对reverse()的调用的更改。这次我构造了viewname参数来使用当前命名空间而不是默认命名空间。
使用url模板标签也是如此。在下面,我使用“with”标签根据我传递给模板的current_namespace上下文变量构造viewname。
<a href="{% url current_namespace|add:':new_preview' %}">Preview</a>
我希望这可以帮助任何尝试以这种方式进行嵌套应用的人。如果有更好的方式我会喜欢学习它