Django出现NoReverseMatch错误:无法反向解析journalrep路由
解决Django NoReverseMatch错误:journalrep路由匹配失败
错误信息
django.urls.exceptions.NoReverseMatch: Reverse for 'journalrep' with arguments '('',)' not found. 2 pattern(s) tried: ['reports/journalrep/(?P[/]+)/(?P[/]+)\Z', 'reports/journalrep/\Z']
相关代码
urls.py配置
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='reports'), path('sumlist/', views.summary_list,name='sumlist'), path('overallsummary',views.overallsummary,name='overallsummary'), path('checkreg', views.checkreg, name='checkreg'), path('checkdet/<chkno>/', views.checkdet, name='checkdet'), path('journalrep/', views.journalrep, name='journalrep'), path('journalrep/<column>/<direction>', views.journalrep, name='journalrep'), path('journaldet/<tranid>', views.journaldet, name='journaldet'), path('accountrep', views.accountrep, name='accountrep') ]
视图函数(journalrep)
@login_required def journalrep(request,column = 'date', direction = 'D'): ''' Produce journal register Will display information for a chart of accounts account if provided. If the value is 0 all journal entries will be shown ''' # # Get list of accounts (Chart of acconts) to be used for account selection box coa = ChartOfAccounts.objects.all().filter(COA_account__gt=0) coa_account = request.session.get('coa_account', None) if len(request.GET) != 0: coa_account = request.GET.get('coa_account') else: if coa_account == None: coa_account = '0' if direction == 'D': direction = '-' else: direction = "" if coa_account == '0': journal = Journal.objects.all().order_by(direction + column) else: journal = Journal.objects.filter(account__COA_account = coa_account).order_by(direction + column) context = { 'coa' : coa, 'journal' : journal , 'coa_account' : Decimal(coa_account)} request.session['coa_account'] = coa_account return render(request, 'reports/journal.html', context)
模板代码(关键问题部分)
<div class="container shadow min-vh-100 py-2"> <h2>Journal Register</h2> <select name="coa_account" hx-get="{% url 'journalrep' row.transactionID %}" hx-target="#requestcontent" > <option value="0">All</option> {% for option in coa %} <option value="{{option.COA_account}}" {% if option.COA_account == coa_account %} selected {% endif %}> {{option.COA_account_name}} {% if option.COA_account_subgroup != "" %} - {{option.COA_account_subgroup}} {% endif %} </option> {% endfor %} </select> <!-- 其余模板代码省略 --> </div>
问题根源
模板中select标签的{% url 'journalrep' row.transactionID %}存在两个核心问题:
row变量仅在下方的{% for row in journal %}循环内定义,在select标签(循环外)未被初始化,导致row.transactionID为空值,传递了无效的空参数给路由。journalrep的路由规则仅支持两种匹配模式:无参数(journalrep/)或接收column和direction两个参数(journalrep/<column>/<direction>),无法匹配仅传递一个空参数的请求。
修复方案
由于该select标签的作用是切换账户筛选条件,且视图已经通过request.GET.get('coa_account')处理GET参数,只需将hx-get指向无参数的journalrep路由即可,htmx会自动将select的name和value作为GET参数发送。
修改后的select标签:
<select name="coa_account" hx-get="{% url 'journalrep' %}" hx-target="#requestcontent">
修改后,用户切换账户时请求会发送到journalrep/,视图通过GET参数获取选中的coa_account值,既符合现有业务逻辑,又避免了路由匹配错误。
内容的提问来源于stack exchange,提问作者Jeff Sinason
相关产品推荐
相关产品推荐

