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
相关产品推荐
相关产品推荐

