django问题:父urlconf中捕获的参数,incude()和反向匹配

时间:2011-04-13 08:41:37

标签: django

如果我想拥有名为app1的django应用程序,它可以让用户将帖子发送到某人的页面和他/她自己的页面。 如果用户已登录,则无需在URL中使用用户名,但url中的username参数可以充当urlconf中的父对象。

说清楚:
urls.py

urlpatterns = patterns(''

    #if registered user/anonymous user visit someone's page
    url(r'^/foo/users/(?P<username>\w+)/app1/',include('app1.urls', namespace='myapp1')),

    #if user is logged in in his own page 
    url(r'^app1/', include('app1.urls', namespace='myapp1')), 
    ...
)

APP1 / urls.py

urlpatterns = patterns('',
    # I expect this pattern receives the username parameter from above 
    url(r'^note/add/$', app1_views.add_note,
     name='add_note'),

    url(r'^note/add/$', app1_views.add_note,
    { 'username':None}, name='add_note_own'),
    ...
    ...    
)    

APP1 / views.py

def add_note(request, username=None):
    ...
    ...

第一个问题
现在例如约翰已经登录并且在杰克的笔记页面上,约翰想发布一张纸条 我希望能够做到这样或接近这样的事情:

模板app1 / notes.html

{% if request.user.is_authenticated %}
    {%if in his/her own note page %}
        <a href="{% url add_note_own %}">add note</a> Expected generated url: www.domain.com/app1/add
    {%else}
        <a href="{ %url add_note %}">add note</a> Expected generated url: www.domain.com/foo/jack/app1/add
    {%endif%}
{% endif %}

这可能吗?

另一件事,
如果约翰在杰克的页面写了注释,并且django给出了注释id == 3,
为了显示该注释,只有这些网址有效:
www.example.com/foo/jack/app1/3
www.example.com/foo/app1/3(如果杰克已登录)

第二个问题:
我想要实现的是反向匹配可以接受捕获的参数到 当url配置中包含include()时,父urlconf。 可以这样做吗?

或者如果你明白我的意思并且可以提供更简单的解决方案,请这样做:) 抱歉,如果这篇文章令人困惑,我很困惑。 非常感谢您的耐心等待。

我正在使用django 1.2.5

1 个答案:

答案 0 :(得分:0)

您需要传递用户名,例如:

urlpatterns = patterns('',
    # I expect this pattern receives the username parameter from above 
    url(r'^note/add/(?P<username>[^/]+)/$', app1_views.add_note, name='add_note'),

    # username is an optional argument, so no need to pass it
    url(r'^note/add/$', app1_views.add_note, name='add_note_own'),
)  

然后在模板中:

{% if request.user.is_authenticated %}
    {% if page.owner == request.user %}
      <a href="{% url add_note_own %}">add note</a>
    {% else %}
       <a href="{% url add_note request.user.username %}">add note to {{ request.user.username }}</a>
    {% endif %}
{% endif %}