django-python:NoReverseMatch问题:我应该给出什么样的论据?

时间:2016-08-16 19:25:22

标签: python django django-urls

我有以下观点:

def default_detail (request, equipment_id):
    equipment = Equipment.objects.get(id = equipment_id)
    context = {'equipment' : equipment}
    return render(request, 'calbase/default_detail.html', context)


def default_add_cal (request, equipment_id):
    equipment = get_object_or_404(Equipment, id = equipment_id)
    EquipmentInlineFormSet = inlineformset_factory(Equipment, Calibration, fields = ('cal_by', 'cal_date', 'notes'), extra = 1, )
    if request.method == "POST":
        if 'calibration' in request.POST:
            formset = EquipmentInlineFormSet(request.POST, request.FILES, instance=equipment)
            if formset.is_valid():
                return HttpResponseRedirect(reverse('calbase:default_detail', args=(equipment_id)))
    else:
        formset = EquipmentInlineFormSet(instance=equipment)
    return render(request, 'calbase/default_detail_cal.html', {'formset' : formset, 'equipment' : equipment})

网址是这样的:

urlpatterns = [
    url(r'^$', views.default, name = 'default'),
    url(r'^default/(?P<equipment_id>[0-9]+)/$', views.default_detail, name = 'default_detail'),
    url(r'^default/new/$', views.default_new, name = 'default_new'),
    url(r'^default/(?P<equipment_id>[0-9]+)/cal/$', views.default_add_cal, name = 'default_add_cal'),
]

和default_add_cal的模板,default_detail_cal.html就像:

{% block content %}
<form method="POST" action = "{% url 'calbase:default_add_cal' equipment.id %}">{% csrf_token %}
        {{ formset }}
        <button type="submit" class="save btn btn-default" name = "calibration">Save</button>
     </form>

<a href="{% url 'calbase:default' %}">Back?</a>
{% endblock %}

因此校准是设备的外键:设备可以有多个校准,在这里我尝试使用inlineformset让用户为设备添加校准。问题是我得到了这个:

  

/ calbase / default / 41 / cal /的NoReverseMatch   反向'default_detail',参数'('4','1')'和关键字参数'{}'未找到。尝试了1种模式:['calbase / default /(?P [0-9] +)/ $']

例如,当我做

时,设备id = 41会让我感到困惑
return HttpResponseRedirect(reverse('calbase:default_detail', args=(equipment_id)))

实际传递的参数是'('4','1')'而不是41.这怎么可能?我该怎么办呢?感谢

1 个答案:

答案 0 :(得分:1)

您应该将参数作为元组传递。这将使args成为可迭代的equipment_id是其中一个参数:

args=(equipment_id,‌​)
#                 ^

这些分组括号不会使参数成为元组:

>>> args = (42)
>>> type(args)
<class 'int'>
>>>
>>> args = (42,)
>>> type(args)
<class 'tuple'>

即使没有parens也能工作:

>>> args = 42,
>>> type(args)
<class 'tuple'>