【问题标题】:Django- NoReverseMatchDjango-NoReverseMatch
【发布时间】:2017-05-21 01:12:32
【问题描述】:

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

将我所做的一些更改推送到服务器后,我发现虽然我所做的更改已经修复了我正在处理的错误(该错误与用户选择日期时未粘贴/保存的日期值有关在其中一个页面上的表格中),项目的另一部分以某种方式损坏(标题为“AddsOmits”的页面)......但我不确定如何,因为我没有对该部分进行任何更改。

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

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

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

当我单击应该将我带到浏览器中的“AddsOmits”页面的链接时(在dateReceived 分支上,我看到一个页面,上面写着:

NoReverseMatch at costing/id/adds_omits

错误消息中的“异常值”如下:

未找到带有参数“('',)”和关键字参数“{}”的“export_csv”的反向操作。尝试了 1 种模式:[u'costing/(?P[0-9]+)/export-csv/$']

页面显示有Error during template rendering,并且:

在模板 /Users/.../costing/templates/costing/adds_omits.html 中,第 28 行出现错误 未找到带有参数 '('',)' 和关键字参数 '{}' 的 'export_csv' 的反向操作。尝试了 1 种模式:[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,然后选择“转到定义”,我会转到 costing/views.py 中的 view 定义:

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'),

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

我在这里做错了什么?浏览器中错误消息中的“异常值”似乎表明我应该在某个地方传递我不是的参数,或者传递不同的参数/不传递我的参数......?

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

编辑

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)

【问题讨论】:

  • 在将更改合并到主分支时遇到了哪些错误?问题的根源就在那里,与上面的代码无关。
  • 我丢弃了合并后出现错误的master 分支,并用我在开始处理此错误之前所做的提交替换了master,所以我的master 分支目前处于实时工作版本的状态。我在我的 OP 中描述的问题仅存在于 dateReceived 分支中 - 我想在这个分支上修复它,这样我就可以在将 master 推送到服务器之前将此分支与 master 合并。

标签: python django url-pattern


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我已经更新了我的 OP 以显示 adds_omits 的视图。 “在模板上下文中不包括budget”是什么意思?我需要以某种方式将budget 对象导入模板吗?
  • 您需要将budget 包含在您在return render(request, 'costing/adds_omits.html', context) 中使用的context 字典中。否则模板不能使用budget反转url。
  • 太棒了-似乎已经解决了。非常感谢!
猜你喜欢
  • 2014-02-10
  • 2013-09-26
  • 2013-01-19
  • 2016-07-20
  • 2017-04-18
  • 2015-07-18
  • 2016-11-09
相关资源
最近更新 更多