【问题标题】:Page not found (404) No Track matches the given query. error Django找不到页面 (404) 没有跟踪匹配给定的查询。错误 Django
【发布时间】: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


【解决方案1】:

好的,我想通了,我必须将我的 eq_detail 视图更改为:

@login_required
def eq_detail(request, track_slug, instrument_slug, id):
    user = request.user
    try:
        instrument = get_object_or_404(Instrument, id=id)
        eq_obj = EQ.objects.get(id=instrument.id)
        eqs = EQ.objects.filter(instrument_id=instrument.id)
        context = {
            'instrument': instrument,
            'eqs': eqs,
            'eq_obj': eq_obj,
        }
        return render(request, 'feed/eq_detail.html', context)
    except EQ.DoesNotExist:
        return redirect('create_eq', track_slug=instrument.track.slug, instrument_slug=instrument.slug, id=instrument.id)

并在我的 eq_detail.html 模板中将 url 链接更改为:

<a href="{% url 'create_eq' instrument.track.slug instrument.slug eq_obj.id %}"><b>Add EQ</b></a>

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2021-09-13
    • 2018-07-04
    • 2013-12-04
    相关资源
    最近更新 更多