我认为我的查询集返回一个空列表而不是"不存在错误"。我希望它返回一个错误,以便我可以返回一个替代消息。 HTML返回一个空的项目符号而不是所需的消息。
view.py
def results(request, foo_id):
template_name = 'results.html'
foo = Foo.objects.get(id=foo_id)
foo_id = foo_id
try:
foobars = FooBar.objects.filter(foo__foo=foo.foo)
return render(request, template_name, {'foobars': foobars,
'zipcode':zipcode, 'foo_id':foo_id})
except FooBar.DoesNotExist:
message = 'Sorry there are no FooBar with that foo'
return render(request, template_name, {'message':message,
'foo_id':foo_id})
models.py
class Foo(models.Model):
foo = models.IntegerField(null=True)
class FooBar(models.Model):
foo = models.ForeignKey('Foo')
title = models.CharField(max_length=100)
description = models.CharField(max_length=400, null=False, blank=True )
def __str__(self):
return self.title
results.html
<html>
<h2>Title</h2>
<ul id='id_results'>
{% for foobar in foobars%}
<li>{{ foobar.name }}</li>
{% empty %}
<li> {{ message }} </li>
{% endfor %}
</ul>
<a href= "/new_foobar/">New FooBar </a>
答案 0 :(得分:1)
.filter()
如果查询集中不存在对象,则不会引发异常,而是返回空列表[]
。
我们可以在查询集上使用.get()
,如果没有对象,则会引发此异常。但是,我们无法使用它,因为查询集中可能有多个对象符合条件,并且在返回多个对象的情况下,它会引发异常。
如果有多个对象,
get()
会引发MultipleObjectsReturned
找到。
您可以使用foobars
的布尔值检查,如果是空列表,则显示消息。
def results(request, foo_id):
template_name = 'results.html'
foo = Foo.objects.get(id=foo_id)
foo_id = foo_id
foobars = FooBar.objects.filter(foo__foo=foo.foo)
if foobars: # check if there are any matching objects
return render(request, template_name, {'foobars': foobars,
'zipcode':zipcode, 'foo_id':foo_id})
else: # no matching objects
message = 'Sorry there are no FooBar with that foo' # display the message
return render(request, template_name, {'message':message,
'foo_id':foo_id})