Django 中 URL conf 的问题

Issues with URL conf in Django

所以我正在从事一个项目,该项目显示数据库中特定艺人发行的标题、歌曲和专辑。我有点卡住了。我正在尝试创建一个页面,当您单击专辑 link 时,该页面会显示专辑中的歌曲。单击 link 时,我希望 URL 显示艺术家的姓名和专辑标题,但我一直收到相同的错误。它正在将专辑名称与艺人名称匹配。

如何让页面显示专辑中的歌曲。

这是查看代码

 def home(request):
    artistes = Artiste.objects.all()
    return render(request, 'music/home.html', locals())


 def details(request, artiste):
    artistes = get_object_or_404(Artiste, name=artiste)
    album = Artiste.objects.get(name=artiste).album_set.all()
    single = Artiste.objects.get(name=artiste).song_set.filter(single=True)
    return render(request, 'music/details.html', {'artistes': artistes, 'single': single, 'album':album})


def album_details(request,name,album):
    albums = get_object_or_404(Album, title=album)
    artistes = get_object_or_404(Artiste, name=name)
    single = Album.objects.get(title=album).song_set.filter(single=False)
     return render(request, 'music/album_detail.html', {'albums': albums, 'single': single})

url 模式

app_name = 'music'

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^(?P<artiste>.+)/$', views.details, name='details'),
    url(r'^(?P<name>.+)/(?P<album>.+)/$', views.album_details, name='album_details')
]

专辑详情页面

<body>
    {% if artistes.album_set.all %}
        {% for songs in album %}
            <h4>Albums</h4>
            <!--<img src="{{album.art}}"><br>
            -->
            <a href="{% url 'music:album_details' songs.artiste songs.title %}">{{songs.title}}</a>
            <h5>{{songs.artiste}}</h5>
            <h5>{{songs.title}}</h5>
        {% endfor %}
    {% else %}
         <h3>No albums available</h3>
         <h5>Check Out Songs </h5>
        <ul>
        {% for song in artistes.song_set.all %}
            <li>{{song}} - mp3</li>
        {% endfor %}
         </ul>
    {% endif %}


</body>
</html>

您的 URL 太笼统了。 .+ 匹配 一切 ,包括像 "Wizked/Starboy" 这样你打算被 album_details URL.

捕获的东西

您可以通过切换这些 URL 模式的顺序来解决此问题,但您还应该使它们不那么通用 - 例如 r'^(?P<artiste>\w+)

代码似乎没问题。是个逻辑问题。

错误是:没有艺人处理这个查询。

在 URLS 中,匹配的 url 是:

url(r'^(?P< artiste >.+)/$', views.details, name='details'),

为什么? 因为“.+”匹配所有内容,包括 "Wizkid/Starboy"

当您到达此代码时:

 albums = get_object_or_404(Album, title=album)

专辑等于"Wizkid/Starboy"

查询引发 404,因为未找到项目。

如果你在 url 中将“.+”更改为“\w+”,如 Daniel 所说,匹配将是:

url(r'^(?P< name>.+)/(?P< album>.+)/$', views.album_details, name='album_details')

那么参数将是:

名字=精灵

专辑 = Starboy

然后你执行代码:

albums = get_object_or_404(Album, title=album)
artistes = get_object_or_404(Artiste, name=name)

如果数据库中有包含同名专辑和艺术家的记录,则会显示该页面。 是不是你还有404.

我建议您至少将相册查询更改为:

albums = Album.objects.filter(title=album)

在html中你可以做:

    {% for songs in album %}
            <h4>Albums</h4>
            <!--<img src="{{album.art}}"><br>
            -->
            <a href="{% url 'music:album_details' songs.artiste songs.title %}">{{songs.title}}</a>
            <h5>{{songs.artiste}}</h5>
            <h5>{{songs.title}}</h5>
        {% empty %}
             No album was found
        {% endfor %}

这样你就可以拥有一个没有专辑的艺术家的页面