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 %}
这样你就可以拥有一个没有专辑的艺术家的页面
所以我正在从事一个项目,该项目显示数据库中特定艺人发行的标题、歌曲和专辑。我有点卡住了。我正在尝试创建一个页面,当您单击专辑 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 %}
这样你就可以拥有一个没有专辑的艺术家的页面