【问题标题】:Django 1.5 - url template tag and reverse function not generating correct url based on current_app instanceDjango 1.5 - url 模板标签和反向函数没有根据 current_app 实例生成正确的 url
【发布时间】:2013-07-13 20:13:52
【问题描述】:

我正在尝试创建一个可供多个应用多次使用的博客应用。但是,无论是 url 模板标签还是视图中的 reverse 调用都不会根据 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'),
    ...
)

blog/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/blog/new

/test1/articles/新

/test2/blog/new

/test2/articles/新

/test3/blog/new

/test3/articles/新

对于“preview_url”上下文变量和锚标记中的href - “test1/blog/new/preview”,我总是得到相同的结果。然而,上下文变量“current_namespace”包含预期的准确值。

我要拔头发了!如何实现我所追求的模块化?

【问题讨论】:

    标签: django django-templates django-views django-urls


    【解决方案1】:

    我想出了一个成功的解决方案,供任何感兴趣的人使用。

    对于我在开题中列出的 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 上下文变量构造视图名称。

    <a href="{% url current_namespace|add:':new_preview' %}">Preview</a>
    

    我希望这可以帮助任何尝试以这种方式创建嵌套应用程序的人。如果有更好的方法我很想了解它

    【讨论】:

      猜你喜欢
      • 2014-10-10
      • 2016-02-24
      • 1970-01-01
      • 2013-04-21
      • 2023-03-31
      • 2011-10-22
      • 2014-05-10
      • 2010-12-19
      • 1970-01-01
      相关资源
      最近更新 更多