【问题标题】:Django Reverse for '' with arguments '()' and keyword arguments '{'}' not found Error没有找到带有参数'()'和关键字参数'{'}'的''的Django Reverse错误
【发布时间】:2013-08-04 17:09:26
【问题描述】:

我是 Django 新手,我正在尝试让用户从选项下拉列表中进行选择,然后将他们的选择传递给我的下一个视图类,以便可以编辑记录。现在我的代码传递了疾病的名称,但没有传递数据库中的 PK。这似乎是一个简单的问题,但我不知道如何解决它。我收到以下错误:

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

代码如下:

views.py

def drui_index(request):
    diseaseForm = DiseaseForm(request.POST)

    if diseaseForm.is_valid():
       #the problem is probably in the below line. The code isn't right.
       new_disease = diseaseForm.cleaned_data['disease']
       url = reverse('drui', kwargs={'someApp_disease_id': new_disease.pk})
       return HttpResponseRedirect(url)

    else:
       diseaseForm = DiseaseForm()

    return render_to_response("drui_index.html", {'diseaseForm': diseaseForm}, context_instance=RequestContext(request))



def drui(request, someApp_disease_id):

    disease = get_object_or_404(Disease, pk=someApp_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)   

          if indicatorInlineFormSet.is_valid():
             new_disease.save()
             indicatorInlineFormSet.save()
             return HttpResponseRedirect(reverse(valdrui))

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

    return render_to_response("drui.html", {'diseaseForm': diseaseForm, 'indicatorInlineFormSet': indicatorInlineFormSet, 'hide_breadcrumb': hide_breadcrumb},context_instance=RequestContext(request))   

forms.py

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

class Meta:
   model = Disease

urls.py

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

drui.html 的 HTML

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

drui_index.html 的 HTML

<form class="disease_form" action="{% url drui_index %}" method="post">{% csrf_token %}
 {{ diseaseForm.as_table }}

更新

通过在我的 kwargs 中添加一个 .pk 来解决它。但现在我得到了一个“drui”的反向,参数“(”,)”和关键字参数“{}”未找到。

【问题讨论】:

  • urls.py 呢?您还安装了任何第三方应用程序吗?
  • 我刚刚添加了我的 urls.py 和 HTML sn-ps。我没有安装任何 3rd 方应用程序。我从另一个帖子中读到我的 disease_id 可能没有 id 属性,这就是它没有通过 PK 的原因。我不确定这是否正确或如何解决它
  • 尝试为视图函数参数和 url 正则表达式定义使用相同的名称,例如 url(r'^drui/(?P&lt;disease_id&gt;\d+).. 和 def drui(request, disease_id):
  • 感谢 vikki,我对视图函数和 url 正则表达式定义使用相同的 id。我更新了上面的代码以反映这一点。如果这很有价值,我正在使用 django 1.4。我知道 1.5 中的 url 处理存在一些差异,人们倾向于使用 {% load url from future %}。但是,我得到了同样的错误
  • 您已更改您的应用程序。您最初想提交给drui,但现在提交给drui_index,是的,错误消失了,但这不是您想要的工作流程吗?

标签: django


【解决方案1】:

我认为 'drui' 是 views.py 中的另一种方法,其中包含另一个模板,当 diseaseForm.is_valid() 时您希望重定向到该模板

views.py

from django.core import urlresolvers
def drui_index(request):
diseaseForm = DiseaseForm(request.POST)

if diseaseForm.is_valid():
   new_disease = diseaseForm.cleaned_data['disease']
   url = urlresolvers.reverse('drui', kwargs={'disease_id': new_disease})
   return HttpResponseRedirect(url)

else:
   diseaseForm = DiseaseForm()

return render_to_response("drui_index.html", {'diseaseForm': diseaseForm}, context_instance=RequestContext(request))

【讨论】:

  • 这有什么不同?
  • 如果你想重定向,使用 urlresolvers.reverse 不是简单的 reverse 。
  • 他大概是这样导入的from django.core.urlresolvers import reverse
  • 告诉他显示整个代码和'drui'方法,如果存在,那就是问题。
  • @user2646813 在您的 HTML 中,将表单操作更改为 {% url drui_index %}。 someApp_disease_id 未定义,并且 不能 在您呈现表单时定义,因为尚未分配 id。您仍在发布到索引视图,然后重定向到详细 (drui) 视图。
【解决方案2】:

正如我之前提到的,至少看起来cleaned_data 只是返回一个CharField,而不是一个model,因此你正在通过一个空的.pk。

【讨论】:

  • 这实际上不是问题 - 它在表单发布操作的 {% url %} 标记中。线索是反向错误抱怨空字符串 - 这是模板的后备,因为它没有看到 someApp_disease_id 变量。索引视图的 POST 分支永远不会被命中。
  • 是的,从技术上讲,他所需要的只是将 {% url drui_index %} 作为表单的操作属性,但希望指向模板上下文进行调试将使请求 -> 发布 -> 重定向询问者的流程更清晰。
  • 但同样,这意味着他作为someApp_disease_id 传递的参数是'',对吗?这意味着.pk 不是new_disease 的实际属性,因为它当前正在设置。我是否正确阅读了代码和错误,还是我遗漏了您要指出的内容?
  • new_disease 永远不存在 - 渲染模板时出错,他永远不会提交表单。 '' 来自 Django(不明智的 imo)在变量查找未找到任何内容时回退到空字符串。
  • 我更新了 html 代码,让 drui.html 和 drui_index.html 有一个。最初的问题是 drui.html,希望它不会让任何人感到困惑。
【解决方案3】:

在drui.html 中,您指的是上下文中不存在的someApp_disease_id,这会给您带来第一个错误,即原始问题中的错误。要解决此问题,只需使其可用。

我不知道应该将哪个 id 存储在此变量中,但您应该在 drui 视图中有类似的内容

return render_to_response("drui.html", 
              {'diseaseForm': diseaseForm,
              'indicatorInlineFormSet': indicatorInlineFormSet,
              'hide_breadcrumb': hide_breadcrumb,
              'someApp_disease_id': new_disease.id}, //<<-add this
              context_instance=RequestContext(request))

当您将 .pk 添加到 drui_index 视图时,您修复了另一个问题 ("Reverse for 'drui' with arguments '()' and keyword arguments '{'someApp_disease_id': &lt;Disease: someDisease&gt;}' not found."),它允许您转到第二个错误,这是我在上面修复的错误。所以基本上你应该将上面的内容添加到drui 并将.pk 留在drui_index 中。这应该可以解决你的问题。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2020-05-19
    • 2012-12-05
    • 2020-09-14
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多