2013-08-04 50 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会默默地执行此操作。我同意显式比隐式更好。 –

相关问题