【问题标题】:Issues with URL conf in DjangoDjango 中的 URL conf 问题
【发布时间】:2016-11-02 11:49:41
【问题描述】:

因此,我正在开展一个项目,该项目显示数据库中特定艺人发布的歌曲和专辑的标题、歌曲和专辑。我有点卡住了。我正在尝试创建一个页面,当您单击专辑链接时显示专辑中的歌曲。单击链接时,我希望 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})

网址格式

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>

【问题讨论】:

  • 该错误是由于:album = get_object_or_404(Album, title=album) 不在 URL 中。
  • @Zartch 我该如何纠正它?

标签: python django url-pattern


【解决方案1】:

您的网址过于笼统。 .+ 匹配所有内容,包括您打算被album_details URL 捕获的“Wizked/Starboy”之类的内容。

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

【讨论】:

    【解决方案2】:

    代码看起来没问题。是一个逻辑问题。

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

    在URLS中,匹配到的url是:

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

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

    当您到达此代码时:

     albums = get_object_or_404(Album, title=album)
    

    专辑等同于“Wizkid/Starboy”

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

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

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

    那么参数将是:

    name = Wizkid

    专辑 = 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 %}
    

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

    【讨论】:

    • 并非所有英雄都穿着斗篷。你是个英雄布鲁。谢谢。我在这件事上已经很久了。祝福
    • 我更喜欢正确的答案,而不是英雄的话。但是谢谢男人。不客气。继续编码。
    猜你喜欢
    • 2015-01-06
    • 2012-11-25
    • 1970-01-01
    • 2013-07-19
    • 2013-10-05
    • 2012-12-04
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多