Django Rest Framework - 如果条件被忽略

时间:2017-05-30 17:41:54

标签: python django django-rest-framework

我创建了一个返回PDF的终点。 我有条件检查资产是否存在,但始终忽略该条件。如果条件不存在,则终点返回500而不是404,因为我想要

网址:

 url(r'^report/asset/(?P<pk>[0-9]+)$', api.DemoPDFView.as_view()),

views.py

from easy_pdf.views import PDFTemplateResponseMixin, PDFTemplateView


class DemoPDFView(PDFTemplateView):
    template_name = 'reports/asset.html'
    pdf_filename = 'asset.pdf'

    def get_context_data(self, **kwargs):
        pk = kwargs['pk']
        if not Asset.objects.filter(id=pk).exists():
               Response(status=status.HTTP_404_NOT_FOUND)
        else:
               asset = Asset.objects.get(id=pk)
               project = asset.project.name
               id = asset.id
               name = asset.title

               return super(DemoPDFView, self).get_context_data(
                   pagesize='A4',
                   title='Asset',
                   project=project,
                   name=name,
                   id=id,
                   **kwargs
                   )

该插件可用:

http://django-easy-pdf.readthedocs.io/en/v0.2.0-dev1/ 

3 个答案:

答案 0 :(得分:1)

由于您的代码不在视图本身中,而是在get_context_data()方法中,我想@schwobaseggl在评论中提到正确的方法是提高Http404异常。

from django.http import Http404
...
if not Asset.objects.filter(id=pk).exists():
    raise Http404
else:
    ...

答案 1 :(得分:1)

更好的版本:

from django.shortcuts import get_object_or_404
asset = get_object_or_404(Asset, pk=pk)

如果Asset不存在,它会自动引发404错误。

答案 2 :(得分:1)

虽然我建议使用@Eugene Morozov回答,但您当前代码的问题是您没有在if

中返回回复
if not Asset.objects.filter(id=pk).exists():
    return Response(status=status.HTTP_404_NOT_FOUND)