Django-NoReverseMatch

Django- NoReverseMatch

我最近接手了一个Python/ Django项目的开发,该项目使用Git作为版本控制,没有使用过Python/ Django或Git 很久以前。

在推送了我对服务器所做的一些更改后,我发现虽然我所做的更改修复了我正在处理的错误(该错误与日期值不一致/当用户 select在其中一个页面的表格中输入了日期),项目的另一部分不知何故被破坏了(标题为 'AddsOmits' 的页面)......但我不确定如何,因为我没有' t对该部分进行了任何更改。

我的修复实际损坏的部分可能来自项目的早期版本,因为我在将更改合并到 master 分支时遇到一些错误,因此需要检查早期的提交。所以这可能是早期提交中存在的错误。

我现在已经将实时服务器上的版本恢复到我上传修复程序之前的版本 - 所以它现在处于工作状态,除了我目前正在处理的 'date' 错误。

在我的本地机器上,我现在有两个分支:master,与实时版本相同(即 'date' 错误仍然存​​在),以及 dateReceived(即我修复了 'date' 错误,但 'AddsOmits' 页面已损坏。

当我单击 link 时,应该会转到浏览器中的 'AddsOmits' 页面(在 dateReceived 分支上,我看到一个页面显示:

NoReverseMatch at costing/id/adds_omits

报错信息中的'Exception Value'为:

Reverse for 'export_csv' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'costing/(?P[0-9]+)/export-csv/$']

并且该页面说有一个 Error during template rendering,并且:

In template /Users/.../costing/templates/costing/adds_omits.html, error at line 28 Reverse for 'export_csv' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'costing/(?P[0-9]+)/export-csv/$']

它抱怨的模板的第 28 行是:

    <a class="button m-r-md" href="{% url 'costing:export_csv' budget.id %}">Export to Excel</a>

因此,如果我理解正确的话,浏览器抱怨的错误似乎与对视图的调用有关 costing:export_csv,而且 URL 模式可能不会不匹配...?

如果我在编辑器 (Sublime) 中右键单击模板中的 costing:export_csv,然后 select 'Goto Definition',我将转到 [=] 中的 view 定义73=].py:

import csv
from django.utils.encoding import smart_str
def export_csv(request, budget_id):
    budget = Budget.objects.get(id=budget_id)
    items = budget.budget_items.all()
    field_names = ('Build type', 'Build type detail', 'Item type client', 'Room', 'Name', 'Detail', 'Quantity', 'Unit', 'Cpu', 'Materials cost', 'Skill days', 'Labour days', 'Other unit', 'Other rate', 'Line margin', 'Total inc profit', 'Notes')
    fields = ([1, 'get_build_type_display'], 'build_type_detail', 'item_type_client', [1, 'get_room_name'], 'name', 'detail', 'quantity', 'unit', 'cpu', 'materials_cost', 'skill_days', 'labour_days', 'other_unit', 'other_rate', 'line_margin', 'total_inc_profit', 'notes')

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=Budget-'+budget.project.project_code+'.csv'
    writer = csv.writer(response, csv.excel)
    response.write(u'\ufeff'.encode('utf8')) # BOM (optional...Excel needs it to open UTF-8 file properly)
    writer.writerow([
        smart_str(u""+field_name) for field_name in field_names
    ])
    for obj in items:
        row = []
        for field in fields:
            if field[0] == 1:
                if hasattr(obj,field[1]): row += [smart_str(u""+plain_char(unicode(getattr(obj,field[1])() or '')))] # For methods such as get_build_type_display()
            elif hasattr(obj,field): row += [smart_str(u""+plain_char(unicode(getattr(obj,field) or '')))]
        writer.writerow(row)
    return response

在costing/views.py 中定义的用于调用此view 的URL 模式是:

    url(r'^(?P<budget_id>[0-9]+)/export-csv/$', views.export_csv, name='export_csv'),

据我所知,一切都正确匹配(定义和调用等)...

我在这里做错了什么?浏览器错误消息中的 'Exception Value' 似乎表明我应该在我不在的地方传递参数,或者传递不同的参数/不传递我在的参数...?

出现此异常的原因是什么,如何解决?任何帮助将不胜感激。

编辑

adds_omitsview 定义为:

def adds_omits(request, project_id):
    project = Project.objects.select_related('variations').prefetch_related('variations__addomit_set','variations__addomit_set__item').get(id=project_id)
    budget = get_current_budget(project_id)
    try: v = project.variations
    except ObjectDoesNotExist: v = Variations.objects.create(project=project)
    adds_omits = project.variations.addomit_set.select_related('item', 'item__project_room', 'item__project_room__room').all().order_by('item__build_type', 'item__build_type_detail', 'item__project_room', 'item__order', 'item__id') #Needs id to prevent other ordering within groups
    budget_items = BudgetItem.objects.select_related('addomit', 'addomit__variations', 'addomit__variations__project', 'project_room', 'project_room__room').filter(addomit__variations=v).order_by('build_type', 'build_type_detail', 'project_room', 'order', 'id') #Needs id to prevent other ordering within groups
    item_formset = BudgetItemFormsetLite(queryset=budget_items, form_kwargs={"ao":True,'project':project})
    ao_formset = AddOmitFormset(instance=v, queryset=adds_omits)
    formsets = zip(list(item_formset.forms), list(ao_formset.forms))

    for i_form in item_formset:
        for field in i_form.fields:
            if not field == 'id':
                i_form.fields[field].widget.attrs['readonly'] = True
                i_form.fields[field].widget.attrs['disabled'] = True

    #Used to create new add omits
    print 'Item form ini'
    item_form = BudgetItemForm(project=project, template=1)
    var_type_form = AoVariationTypeForm()

    context = {
        'project': project,
        'formsets': formsets,
        'ao_formset': ao_formset,
        'item_formset': item_formset,
        'var_type_form': var_type_form,
        'item_form': item_form,
        'widths': budget_item_column_widths[4:], #First column is add/delete options to allow for forloop count offset
        'options_width': "5em",  #First column is add/delete options to allow for forloop count offset
        'widths_ao': add_omit_column_widths,
        'widths_item': budget_item_column_widths, #First column is add/delete options to allow for forloop count offset
        'labour_rate': labour_day_rate,
        'skill_rate': skill_day_rate,

    }

    return render(request, 'costing/adds_omits.html', context)

错误出现在 costing/id/adds_omits 的视图中,您尚未显示。

arguments '('',) 表明您没有在模板上下文中包含 budget,因此 {% url 'costing:export_csv' budget.id %} 中的 budget.id 被评估为空字符串 '' .