You need to enable JavaScript to run this app. Django模板创建create_eq跳转链接时出现NoReverseMatch错误求助
优惠活动
大模型
产品
解决方案
定价
更多

Django模板创建create_eq跳转链接时出现NoReverseMatch错误求助

错误原因及修复方案

1. 直接报错原因:urls.py路由语法错误

你写的create_eq路由中,id参数缺少左尖括号,导致Django无法正确识别参数类型,匹配失败。
原错误代码:

path('create-eq/<slug:track_slug>/<slug:instrument_slug>/int:id>/', views.create_eq, name='create_eq'),

修正后:

path('create-eq/<slug:track_slug>/<slug:instrument_slug>/<int:id>/', views.create_eq, name='create_eq'),

2. 模板传参错误

你在循环遍历乐器列表时,用了全局的instrument.slug而不是当前循环项的slug,会导致所有链接传的都是同一个乐器的slug:
原错误代码:

<a href="{% url 'create_eq' track.slug instrument.slug track.id %}"><h5>{{ items.title }}</h5></a>

修正后:

<a href="{% url 'create_eq' track.slug items.slug track.id %}"><h5>{{ items.title }}</h5></a>

3. create_eq视图逻辑错误

你用同一个id参数同时查询Track和Instrument,这会导致当Track和Instrument的id不一致时直接404,另外保存EQ时没有关联对应的track和instrument外键:
原错误代码:

@login_required
def create_eq(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)
    if request.method == "POST":
        form = EQCreateForm(request.POST)
        if form.is_valid():
            data = form.save(commit=False)
            data.user = user
            data.save()
            return redirect('profile', slug=track.slug, id=track.id)
    else:
        form = EQCreateForm()
    return render(request, 'feed/create_eq.html', {'form': form })

修正后:

@login_required
def create_eq(request, track_slug, instrument_slug, id):
    user = request.user
    track = get_object_or_404(Track, id=id)
    # 根据传入的slug查询乐器,而不是用track的id查
    instrument = get_object_or_404(Instrument, slug=instrument_slug)
    if request.method == "POST":
        form = EQCreateForm(request.POST)
        if form.is_valid():
            data = form.save(commit=False)
            data.user = user
            # 补充关联外键
            data.track = track
            data.instrument = instrument
            data.save()
            return redirect('profile', slug=track.slug, id=track.id)
    else:
        form = EQCreateForm()
    return render(request, 'feed/create_eq.html', {'form': form })

4. instrument_detail视图逻辑优化

你当前的路由中instrument-detail/<slug:track_slug>/<int:id>/里的id是Track的id,你用这个id去查询Instrument逻辑不合理,如果你这个页面是展示单个Track下的所有乐器,不需要单独查instrument_obj,可以删掉对应代码:
修正后参考:

@login_required
def instrument_detail(request, track_slug, id):
    user = request.user
    track = get_object_or_404(Track, id=id)
    instruments = Instrument.objects.filter(track_id=track.id)
    if instruments.exists():
        context = {
            'instruments': instruments,
            'track': track,
        }
        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)

内容的提问来源于stack exchange,提问作者mac95782

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 11:57:03