使用foreignkey字段查找时Django中的NoReverseMatch

时间:2014-08-24 06:28:36

标签: django

我是Django的新手,我正在编写一个列出用户实验室设备的sysinfo应用程序。 “所有者”视图显示分配给用户的所有设备的表。表中的每个设备都有一个指向另一个页面的链接,该页面会重置某些数据,并重定向回所有者页面。

的sysinfo / models.py

class Lab_setup(models.Model):
    owner = models.CharField(max_length=100)

class Device(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(Lab_setup)
    ...

的sysinfo / urls.py

url(r'^(?P<owner>[-\w]+)/$', views.owner, name='owner'),    # /lab/username
url(r'^(?P<owner>[-\w]+)/(?P<name>[-\w\d]+)/refresh/$', views.refresh, name='refresh'), # /lab/username/devicename/refresh

的sysinfo / views.py

def owner(request, owner):
    device_list = get_list_or_404(Device.objects.order_by('col_order'), owner__owner=owner, active=True)
    return render(request, 'sysinfo/lab_owner.html', {'device_list': device_list})

def refresh(request, owner, name):
    device = get_object_or_404(Device, name=name, owner__owner=owner)
    device.last_ts = None
    device.refresh_count = 0
    device.save()
    return HttpResponseRedirect(reverse('sysinfo:owner', kwargs={'owner__owner':owner}))

“所有者”页面工作正常,并显示所有用户的设备。该网址类似于“/ lab / username /”。当您单击该链接时,它会转到URL“/ lab / username / devicename / refresh”。加载的页面显示错误:

Reverse for 'owner' with arguments '()' and keyword arguments '{'owner__owner': u'username'}' not found. 1 pattern(s) tried: [u'lab/(?P<owner>[-\\w]+)/$']

我不知道为什么owner__owner不适用于反向,当它适用于get_list_or_404时。

1 个答案:

答案 0 :(得分:3)

那是因为你的关键字参数是owner而不是owner__owner

将其更改为:

return HttpResponseRedirect(reverse('sysinfo:owner', kwargs={'owner':owner}))

应该有用。

==编辑==

在这种情况下,反向util函数会查找名称为owner的名称空间sysinfo的URL。它会查找希望获得您在kwargs词典中传递的命名参数的URL。

你的URL conf表示它希望传递给它的参数中有关键字owner。这就是您需要传递owner关键字..

的原因

关于这代表查找字段等这一事实 - 这并不重要,因为它对我们人类来说只是一个逻辑问题。所有URL配置都需要关键字本身来匹配给定的正则表达式在其定义中。您可以轻松地通过{"owner": "abc"}并找到要调用的网址和视图(也许您在视图中的逻辑会失败,因为您希望有效的所有者,但那是另一回事)

另一方面,get_object_or_404会构建一个查询,您希望其Device外键Lab_setup <的对象(owner) em> field 具有一定的价值,这就是为什么你正在寻找虽然关系:owner__owner

希望澄清事情。