我是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时。
答案 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
。
希望澄清事情。