2013-08-04 49 views
0

我在過去一天遇到了這個錯誤,似乎無法解決它。Django爲參數'(7,)'和關鍵字參數'{}'形成反向'

Reverse for '' with arguments '(7,)' and keyword arguments '{}' not found. 

我的目標是讓用戶從我的drui_index頁面中選擇一種疾病。然後用戶被帶到drui頁面添加或編輯指標。在我的模型中,每種疾病都有多個指標。當我到達drui頁面時,出現上述錯誤,我不知道爲什麼。錯誤中的'7'是疾病表中的PK。

Views.py

def drui_index(request): 
    disease_list = Disease.objects.all() 
    context = {'disease_list':disease_list} 
    return render(request, 'drui_index.html', context) 


def drui(request, disease_id): 
    disease = get_object_or_404(Disease, pk=disease_id) 

    if request.method == "POST": 

     diseaseForm = DiseaseForm(request.POST, instance=disease) 
     indicatorInlineFormSet = IndicatorFormSet(request.POST, request.FILES, instance=disease) 

     if diseaseForm.is_valid(): 
     new_disease = diseaseForm.save(commit=False) 
     indicatorInlineFormSet.save() 
     return HttpResponseRedirect(reverse('drui', kwargs={'disease_id':disease_id})) 

    else: 
     diseaseForm = DiseaseForm(instance=disease) 
     indicatorInlineFormSet = IndicatorFormSet(instance=disease) 

    return render(request, 'drui.html', {'disease':disease, 'diseaseForm':diseaseForm, 'indicatorInlineFormSet': indicatorInlineFormSet}) 

HTML drui.html

<form class="disease_form" action="{% url drui disease.id %}" method="post">{% csrf_token %} 
    {{ disease }} 
    {{ diseaseForm.as_table }} 
    {{ indicatorInlineFormSet.as_table }} 

urls.py

url(r'^drui_index/$', 'Physician_UI.views.drui_index', name='drui_index'), 
url(r'^drui_index/(?P<disease_id>\d+)/$', 'Physician_UI.views.drui', name='drui'), 

forms.py

class DiseaseForm(forms.ModelForm): 
    disease = forms.ModelChoiceField(queryset=Disease.objects.all()) 

    class Meta: 
     model = Disease 

IndicatorFormSet = inlineformset_factory(Disease, 
    Indicator, 
    can_delete=False, 
    extra=MAX_INDICATORS) 

在我的views.py,我不認爲我需要調用diseaseForm,因爲我已經在drui_index選擇的一種疾病。但是,我不認爲這是造成問題的原因。

回答

3

我認爲你缺少周圍URL名稱報價:(如果你正在使用Django> = 1.5),或在模板中使用{% load url from future %}

{% url drui disease.id %} 

應該是:

{% url "drui" disease.id %} 
+1

Wow..worked!謝謝!這是一個愚蠢的錯誤.. – nlr25

3

url標記應是{% url "drui" disease_id=disease.id %},因爲你需要傳入關鍵字參數。

查看documentation瞭解更多信息。

正如你永遠不保存新條目,我覺得你只是使用的形式來顯示ModelChoiceField,在這種情況下,你並不需要一個ModelForm

class DiseaseForm(forms.Form): 
    disease = forms.ModelChoiceField(queryset=Disease.objects.all()) 

這樣,你避免了commit=False部分。

你應該總是有你的if form.is_valid()else

from django.shortcuts import redirect 

def drui(request, disease_id): 
    disease = get_object_or_404(Disease, pk=disease_id) 
    ctx = {} 
    ctx['disease'] = disease 
    ctx['indicatorInlineFormSet'] = IndicatorFormSet() 
    ctx['diseaseForm'] = DiseaseForm() 

    if request.method == "POST": 

     diseaseForm = DiseaseForm(request.POST) 
     indicatorInlineFormSet = IndicatorFormSet(request.POST, request.FILES) 

     if diseaseForm.is_valid(): 
     return redirect('drui', disease_id=disease_id) 
     else: 
     # Form wasn't valid, return the same view to display the errors 
     ctx['diseaseForm'] = diseaseForm 
     ctx['indicatorInlineFormset'] = indicatorInlineFormset 
     return render(request, 'drui.html', ctx) 

    else: 

     return render(request, 'drui.html', ctx) 
+1

這不是一條硬性規則。如果你以相同的順序傳遞參數,django會以相同的順序將它分配給關鍵字參數。 –

+0

「顯式優於隱式」 - Python的禪宗。 –

+1

我知道這不是它在Python中的工作方式,但它是'Django'。如果您檢查源代碼,Django會默默地執行此操作。我同意顯式比隱式更好。 –

相關問題