You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 %}存在两个核心问题:

  1. row变量仅在下方的{% for row in journal %}循环内定义,在select标签(循环外)未被初始化,导致row.transactionID为空值,传递了无效的空参数给路由。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:01:34