2016-08-16 40 views
1

我有以下幾點看法:django-python:NoReverseMatch問題:我應該給它什麼參數?

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}) 

和URL是這樣的:

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來讓用戶爲設備添加校準。問題是,我得到這個:

NoReverseMatch在/ calbase /默認/ 41/CAL/ 逆向關於 'default_detail' 與參數 '(' 4' , '1')」和關鍵字參數 '{}'未找到。 1個圖案(多個)嘗試:[ 'calbase /默認//$(P [0-9] +?)']

它混淆我,例如,對於設備ID = 41,當我做

return HttpResponseRedirect(reverse('calbase:default_detail', args=(equipment_id))) 

實際傳遞的參數是'('4','1')'而不是41.這怎麼可能?我應該如何解決這個問題?謝謝

回答

1

您應該將參數作爲元組傳遞。這將使args可迭代與equipment_id是其中一個參數:

args=(equipment_id,‌​) 
#    ^

這些分組括號不會使參數的元組:

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

作品即使沒有括號:

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

謝謝!這解決了我的問題。請您詳細介紹一下這個「,」的功能嗎? –

+0

@HansongLi這就是元組的定義。要創建一個單例元組,您需要添加該逗號。我添加了一些代碼。讓我知道如果這是足夠的 –

+0

哦,這確實清除了事情。非常感謝! –

相關問題