Django音乐应用程序的urls.py结构

时间:2013-02-18 14:09:54

标签: django django-urls

我在构建Django应用程序的urls.py文件时遇到了一些问题。

我的项目是一个基本的音乐播放器应用程序。首先点击音乐的链接,然后点击(例如)艺术家,然后选择艺术家,例如 Weezer 。该应用随后会显示该艺术家的专辑和歌曲列表,并通过 views.artist_name 功能在 artist_name.html 模板上呈现。

到目前为止,在应用的导航中,网址将类似于 http:// localhost / music / artists / Weezer /

我的问题在于下一个URL的编码。如果我选择Weezer的专辑 The Blue Album ,我会返回以下网址: http:// localhost / music / artists / Weezer / The%20Blue%20Album

这应该使用 views.artist_album_title 函数呈现名为 artist_album_title.html 的模板。相反,它使用与当前页面相同的 views.artist_name 功能呈现新页面。

似乎正在发生的事情是 ... Weezer /%20Blue%20Album / 的正则表达式模式与我的urls.py文件中的相关URL模式不匹配。作为Django的新手(并且使用正则表达式的经验很少),我很难确定我的urls.py文件对于这种应用程序应该是什么样的。

下面是我目前的urls.py文件。任何有关我的问题的帮助都会受到欢迎。谢谢你们。

from django.conf.urls import patterns, include
from music.views import home, music, artists, artist_name,  artist_album_title

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
    (r'^$', home),
    (r'^music/$', music),
    (r'^music/artists/$', artists),
    (r'^music/artists/([\w\W]+)/$', artist_name),
    (r'^music/artists/([\w\W]+)/([\w\W]+)/$', artist_album_title),
)
来自views.py的

artist_album_title函数

def artist_album_title(request, album_title):
    album_tracks = Track.objects.filter(album__title=album_title)
    return render_to_response('artist_album_title.html', locals(), context_instance=RequestContext(request))

1 个答案:

答案 0 :(得分:0)

你的urlpatterns的问题是url / music / artists / Weezer /%20Blue%20Album满足第一个模式,因此它不会转到下一个模式。这是因为Django按照指定的顺序执行模式。

为了实现这一点,您必须切换两个模式的位置,如下所示:

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
    (r'^$', home),
    (r'^music/$', music),
    (r'^music/artists/$', artists),
    (r'^music/artists/([\w\W]+)/([\w\W]+)/$', artist_album_title),
    (r'^music/artists/([\w\W]+)/$', artist_name),

)

最好的方法是为您的网址使用以下结构:

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
    (r'^$', home),
    (r'^music/$', music),
    (r'^music/artists/$', artists),
    (r'^music/artists/(?P<artist_name>[\w\W]+)/(?P<album_title>[\w\W]+)/$', artist_album_title),
    (r'^music/artists/(?P<artist_name>[\w\W]+)/$', artist_name),

)

然后您的视图定义将如下所示:

def artist_album_title(request, artist_name,album_title):

def artist_name(request, artist_name):

您可以在此处阅读有关Django文档中网址中命名组的更多信息 https://docs.djangoproject.com/en/dev/topics/http/urls/#named-groups