Django中URL conf的问题

时间:2016-11-02 11:49:42

标签: python django url-pattern

因此,我正在开展一个项目,该项目显示特定艺术家从数据库中发布的歌曲和歌曲以及专辑。我有点卡住了。我在点击相册链接时尝试创建一个显示相册中歌曲的页面。单击链接时,我希望URL显示艺人的名称和专辑的标题,但我仍然会收到相同的错误。它将专辑名称与艺人名称相匹配。

如何让页面显示相册中的歌曲。

Money

以下是观看次数

 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})

网址格式

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>

2 个答案:

答案 0 :(得分:0)

您的网址过于通用。 .+匹配所有内容,包括您打算通过album_details网址捕获的“Wizked / Starboy”等内容。

您可以通过切换这些网址格式的顺序来解决此问题,但您也应该减少它们的通用性 - 例如r'^(?P<artiste>\w+)等。

答案 1 :(得分:0)

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

错误是:没有艺人加工此查询。

在URLS中,匹配的网址为:

  

url(r'^(?P&lt; artiste&gt;。+)/ $',views.details,name ='details'),

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

当您到达此代码时:

 albums = get_object_or_404(Album, title=album)

专辑等于“Wizkid / Starboy”

查询引发了404因为没有找到任何项目。

如果您更改网址“。+”和“\ w +”作为Daniel Said,则匹配将是:

  

url(r'^(?P&lt; name&gt;。+)/(?P&lt; album&gt;。+)/ $',views.album_details,name ='album_details')

那么参数就是:

name = Wizkid

album = 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 %}

这样您就可以拥有一个没有相册的艺术家的页面