为什么要在此代码中检查“如果id不为None”?

时间:2019-04-15 11:10:04

标签: python django

我正在分别学习一个名为“原始删除基于类的视图,原始更新,列表和详细信息基于类的视图”的教程。我掌握了一切,只有一个。

course_list.html中,我具有以下链接:

<a class="delete-btn" href="{% url 'courses:course-delete' obj.id %}">Delete</a>

如果用户单击并确认删除,它将从课程列表中删除该课程。

问题是为什么讲师要检查if id is not None:?即使如果他从代码中忽略了这一点,它仍然可以正常工作。此外,“ id”为“无”的可能性为零,因为用户单击下面的表格,该链接会将用户引导到一条特定的路线,该路线最终删除了该路线。请帮助我理解这一点!

enter image description here

这是代码:

class CourseDeleteView(View):
    template_name = "course/course-delete.html"

    def get_object(self):
        id = self.kwargs.get('id')
        obj = None
        if id is not None:  # why would he do that?
            obj = get_object_or_404(Course, id=id)
        return obj

    def get(self, request, id=None, *args, **kwargs):
        context = {}
        obj = self.get_object()
        if obj is not None:    # here, why checking obj for not None?
            context['object'] = obj
        return render(request, self.template_name, context)

    def post(self, request, id=None,  *args, **kwargs):
        context = {}
        obj = self.get_object()
        if obj is not None:  # and here
            obj.delete()
            context['object'] = None
            return redirect('/course/')
        return render(request, self.template_name, context)

提前谢谢

编辑:urls.py

app_name = 'courses'
urlpatterns = [
    path('courses/<int:id>/delete/',
         CourseDeleteView.as_view(), name='course-delete'),
]

2 个答案:

答案 0 :(得分:2)

我认为没有任何理由这样做,如果idNone,那么get_object_or_404将会提高Http404

documentation对此很清楚:

  

以下示例从MyModel获取主键为1的对象:

from django.shortcuts import get_object_or_404

def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)
     

此示例等效于:

from django.http import Http404

def my_view(request):
    try:
        obj = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")

答案 1 :(得分:0)

通常,编写这样的条件是一种好习惯,因为您要确保代码永不失败。在Web应用程序中,它尤为重要,因为可以从任何地方访问URL。

在这个特定示例中,您是对的,如果ID不存在,则路由本身将失败。但是,如果我们将id重组为查询参数(例如/courses/delete?id=x),那么这部分代码就变得很有必要。

基本上是sanity check