【发布时间】:2021-09-18 20:29:38
【问题描述】:
单击 eq_detail 页面的链接时,我收到此页面未找到错误。链接由“instrument_detail.html”模板中的 for 循环生成,第一个链接有效,但其他链接返回此错误。
错误
Page not found (404)
No Track matches the given query.
Request Method: GET
Request URL: http://127.0.0.1:8000/eq-detail/wonderful/guitar/2/
Raised by: feed.views.eq_detail
不知道是什么问题,这是我的网址、视图和模板
urls.py
path('instrument-detail/<slug:track_slug>/<int:id>/', views.instrument_detail, name='instrument_detail'),
path('eq-detail/<slug:track_slug>/<slug:instrument_slug>/<int:id>/', views.eq_detail, name='eq_detail'),
views.py
@login_required
def instrument_detail(request, track_slug, id):
user = request.user
track = get_object_or_404(Track, id=id)
my_inst = Instrument.objects.filter(track_id=track.id)
instrument_obj = get_object_or_404(Instrument, id=id)
if my_inst.exists():
instruments = Instrument.objects.filter(track_id=track.id)
context = {
'instruments': instruments,
'track': track,
'instrument': instrument_obj,
}
return render(request, 'feed/instrument_detail.html', context)
else:
print('There are no instruments set in your track')
return redirect('create_instrument', track_slug=track.slug, id=track.id)
@login_required
def eq_detail(request, track_slug, instrument_slug, id):
user = request.user
track = get_object_or_404(Track, id=id)
instrument = get_object_or_404(Instrument, id=id)
eq_obj = get_object_or_404(EQ, id=id)
eqs = EQ.objects.filter(instrument_id=instrument.id)
if eqs.exists():
context = {
'track': track,
'instrument': instrument,
'eqs': eqs,
'eq_obj': eq_obj,
}
return render(request, 'feed/eq_detail.html', context)
else:
return redirect('create_eq', track_slug=track.slug, instrument_slug=instrument.slug, id=instrument.id)
eq_detail.html
<a href="{% url 'instrument_detail' track.slug track.id %}"><b>Back To Instruments</b></a>
<br>
<br>
<div class="container my-tracks">
{% if eqs|length >= 1 %}
<div class="row row-cols-3 row-cols-md-2 g-4">
{% for item in eqs %}
<div class="col">
<div class="card one-track">
<h5>Eq: {{ item.id }} </h5>
<h5>Frequency: {{ item.frequency }}</h5>
<h5>Boost: {{ item.boost }}</h5>
<h5>Cut: {{ item.cut }}</h5>
</div>
</div>
{% endfor %}
</div>
{% else %}
<a href="{% url 'create_eq' track.slug instrument.slug item.id %}"><b>Add EQ</b></a>
{% endif %}
</div>
instrument_detail.html
<div class="container my-tracks">
{% if instruments|length >= 1 %}
<div class="row row-cols-3 row-cols-md-2 g-4">
{% for item in instruments %}
<div class="col">
<div class="card one-track">
<a href="{% url 'eq_detail' track.slug item.slug item.id %}"><h5>{{ item.title }}</h5></a>
</div>
</div>
{% endfor %}
{% else %}
<a href="{% url 'create_instrument' track.slug track.id %}"><b>Add Instrument</b></a>
{% endif %}
【问题讨论】:
-
在
eq_detail中,您已经编写了track = get_object_or_404(Track, id=id),但 url 中的 id 属于 instrument 而不是 track。同样在同一个函数中,你有eq_obj = get_object_or_404(EQ, id=id)这又是错误的...... -
谢谢,你能澄清一下吗,我想要一个 eq-detail 的 url 路径,例如:eq-detail/slug:track_slug>/slug:instrument_slug>/int:id>/ ,带有 id作为 eq 模型 ID,我该怎么做?我也在 eq_detail 视图中执行 track = get_object_or_404(Track, id=id) 以在 instrument_detail.html 页面中获取 track.slug,这是正确的做法吗?
标签: django django-views django-templates