我正在尝试获取单个对象的所有属性。我不断收到“设备匹配查询不存在”。我就是想不通我的问题。
模型.py
`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)`
View .py
def view_status(请求,pk=None): 设备 = Devices.objects.get(pk=pk) 返回渲染(请求,'homesite/device_status.html',设备)
网址.py
url(r'^viewstatus/$', views.view_status, name='ViewStatus'),
这是我用来调用 http://localhost:8000/homesite/viewstatus/?pk=1 的 url
device_satus.html
{% 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 %}
我的 able 中有 4 条记录,所以我知道 PK=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'),
您编写 View 的方式很好:
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 如果您放入 URI 的 pk 存在于您的数据库中,则将按您预期的方式运行。
请注意,这是获取对象的首选方式。
<强> 2。方法 强>
在这种情况下,您将 pk 作为参数传递,因此调用 http://localhost:8000/homesite/viewstatus/?pk=1,例如。现在 pk 是 GET 请求的参数。在这种情况下:
# urls.py
url(r'^viewstatus/$', views.view_status, name='ViewStatus'),
并且 View 仅将 request 对象作为参数。在 View 中,您可以按如下方式获取 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 对象之外,您的 View 不接受任何参数。
另一个问题在您的 View 函数中:Django 的快捷方式 render为可选参数 context 使用一个 dict 对象。目前您直接传递一个 Devices 对象。您需要在 view_status 中更新您的返回声明:
return render(request, 'homesite/device_status.html', {'device' : device})
希望对您有所帮助!
