【问题标题】:NoReverseMatch arguments djangoNoReverseMatch 参数 django
【发布时间】:2013-01-17 04:21:14
【问题描述】:

为什么这会返回 NoReverseMatch 错误?

查看:

def browse(request):
    thing_list = Thing.objects.all()
    if request.method == 'POST':
        form = BrowseForm(request.POST)
        if form.is_valid():
            make = Make.objects.all()
            return HttpResponseRedirect(reverse('browse_makes', args=[make]))
    else:
        form = BrowseForm()
    return render(request, 'browse.html', {'form':form, 'thing_list':thing_list})

def makes(request, make):
    ad_list = Thing.objects.filter(make=make)
    return render(request, 'browse-makes.html', {'thing_list':thing_list})

网址:

url(r'^browse/$', 'axlepost.views.browse.browse', name='browse'),
url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse.makes', name='browse_makes'),

表格:

class BrowseForm(forms.Form):
     make = forms.ModelChoiceField(queryset=Make.objects.all())

型号:

class Make(models.Model):
    make = models.CharField(max_length=20)

class Thing(models.Model):
    make = models.ForeignKey(Make)

返回Reverse for 'browse_makes' with arguments '([&lt;Make: Samsung&gt;],)' and keyword arguments '{}' not found. 感谢您提供有关如何解决此错误的想法!

【问题讨论】:

  • 请检查你的 urls.py 的第二行,它应该是 'axlepost.views.makes' 然后检查一下。

标签: django django-urls


【解决方案1】:

您正在处理 reverse() 一个 QuerySet 而不是 1 个值。它也是一个.all() 查询,因此它很可能有多个对象,并且与表单结果无关。

make = Make.objects.all() # QuerySet = ([<Make: Samsung>], [<Make: Sony>], [<Make: Apple>], etc)
return HttpResponseRedirect(reverse('browse_makes', args=[make])) # Expects 1 value

假设您想重定向到表单中选择的Make,那么您需要类似:

if form.is_valid():
    # Get the valid form data
    cd = form.cleaned_data

    # Get the selected Make
    make = cd.get('make')

    # Redirect - note 'make.make'.  You want to pass the value not the object
    return HttpResponseRedirect(reverse('browse_makes', kwargs={'make': make.make}))

【讨论】:

  • 谢谢。但应该是cleaned_data 而不是clean_data。谢谢!
【解决方案2】:

我认为有几个问题

  • 您的网址与适当的视图不对应

改变这一行

url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse.makes', name='browse_makes'),

url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse', name='browse_makes'),
  • 将视图定义更改为采用make 参数

    def 浏览(请求,制作): ... #将你的局部变量'make'改成别的东西

【讨论】:

  • 感谢您的回复,但我不确定这是否能解决我的问题。我在上面添加了更多信息。我正在尝试使用具有不同make 选项的下拉浏览表单,然后当用户选择品牌时,它会重定向到browse_make。这有意义吗?
  • @NickB,您的视图文件是views.py 和其中的视图函数(makes)。那你需要把'axlepost.views.browse.makes'改成'axlepost.views.makes'
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2017-05-14
  • 2013-06-12
  • 1970-01-01
  • 2015-02-25
  • 2019-07-15
  • 2018-04-21
相关资源
最近更新 更多