我正在尝试获取单个对象的所有属性。我一直在收到“设备匹配查询不存在”。我无法弄清楚我的问题。
`class Devices(models.Model):
category_id = models.ForeignKey(Category, on_delete=models.CASCADE)
device_description = models.CharField(max_length=100)
device_status = models.CharField(max_length=50)
device_date = models.DateTimeField()
device_user = models.CharField(max_length=50)`
def view_status(request, pk=None):
device = Devices.objects.get(pk=pk)
return render(request, 'homesite/device_status.html', device)
url(r'^viewstatus/$', views.view_status, name='ViewStatus'),
here is the url I use to call http://localhost:8000/homesite/viewstatus/?pk=1
{% extends "base.html" %}
{% block head %}
<title>Device Status</title>
{% endblock%}
{% block body %}
<h3>Device Status Detail</h3>
{{ devices.device_description }}
{{ devices.device_status }}
{{devices.device_date|date:"Y-m-d H:m:s"}}
{% endblock %}
我的能力中有4条记录,所以我知道PK = 1匹配。
答案 0 :(得分:1)
请注意,这不是构建访问特定对象的URL的常用方法。下面我首先介绍在URI中集成pk
的方法,以及将pk
作为参数传递的方法。
<强> 1。方法强>
在这里,您将pk
放入URI并请求http://localhost:8000/homesite/viewstatus/1/
之类的内容。如果您这样做,则需要通过指定URI的哪一部分是您想要的pk
来调整urls.py:
# urls.py
url(r'^viewstatus/(?P<pk>\d+)/$', views.view_status, name='ViewStatus'),
您编写视图的方式很好:
def view_status(request, pk=None):
if pk is not None:
device = Devices.objects.get(pk=pk)
else:
device = None
return render(request, 'homesite/device_status.html', {'device' : device})
现在,views.view_status
将同时使用request
对象和pk
作为参数进行调用,objects.get
将按预期运行,如果你输入的pk URI存在于您的数据库中。
请注意,这是获取对象的首选方式。
<强> 2。方法强>
在这种情况下,您将pk
作为参数传递,因此请调用http://localhost:8000/homesite/viewstatus/?pk=1
。现在pk
是GET请求的参数。在这种情况下:
# urls.py
url(r'^viewstatus/$', views.view_status, name='ViewStatus'),
视图仅将request
对象作为参数。在视图中,您可以按如下方式获取pk:
def view_status(request):
pk = request.GET.get('pk', None)
if pk is not None:
device = Devices.objects.get(pk=int(pk))
else:
device = None
return render(request, 'homesite/device_status.html', {'device' : device})
因此,在这种情况下,您的视图不会采用request
对象以外的任何参数。
另一个问题出在你的视图函数中:Django的快捷方式render
为可选参数dict
提供了一个context
对象。目前,您直接传递Devices对象。您需要在view_status
中更新return语句:
return render(request, 'homesite/device_status.html', {'device' : device})
希望有所帮助!
答案 1 :(得分:0)
尝试更改您的查看功能:
def view_status(request):
pk = request.GET['pk']
device = Devices.objects.get(pk=pk)
return render(request, 'homesite/device_status.html', device)
让我知道它是否有帮助:)
答案 2 :(得分:0)
我收到错误'Devices'对象不可迭代
这是网址的设置方式。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="rtsnp_home.css">
<title>Rolling Thunder Special Needs Program</title>
</head>
<body>
<div class="navbar">
<a href="#home">Home</a>
<!--no drop down-->
<div class="dropdown">
<button class="dropbtn">About Us
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content">
<a href="#">Mission Statement</a>
<a href="#">Our Founder</a>
<a href="#">Our Board of Directors</a>
<a href="#">National Board of Directors</a>
<a href="#">Programs Offered</a>
</div>
</div>
<div class="dropdown">
<button class="dropbtn">Our Athletes
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content">
<a href="#"> Link 1</a>
</div>
</div>
</div>
</body>
</html>
但应该是这样的
url(r'^viewstatus/$', views.view_status, name='ViewStatus'),
这样我可以这样打电话吗? url(r'^viewstatus/(?P<pk>\d+)/$', views.view_status, name='ViewStatus'),
http://localhost:8000/homesite/viewstatus/1/
所以我需要使用相应的views.py代码
def view_status(request):
pk = request.GET['pk']
device = Devices.objects.get(pk=pk)
return render(request, 'homesite/device_status.html', device
我已经盯着这几个小时,所以我知道我错过了一些简单的事情。