Django objects.get匹配查询不存在

时间:2018-01-13 23:58:16

标签: python django django-views

我正在尝试获取单个对象的所有属性。我一直在收到“设备匹配查询不存在”。我无法弄清楚我的问题。

Models.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)`

Views.py

def view_status(request, pk=None): device = Devices.objects.get(pk=pk) return render(request, 'homesite/device_status.html', device)

urls.py

url(r'^viewstatus/$', views.view_status, name='ViewStatus'),

here is the url I use to call http://localhost:8000/homesite/viewstatus/?pk=1

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 %}

我的能力中有4条记录,所以我知道PK = 1匹配。

3 个答案:

答案 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'对象不可迭代

urls.py

这是网址的设置方式。     <!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'),

views.py

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

我已经盯着这几个小时,所以我知道我错过了一些简单的事情。