我正在分别学习一个名为“原始删除基于类的视图,原始更新,列表和详细信息基于类的视图”的教程。我掌握了一切,只有一个。
在course_list.html
中,我具有以下链接:
<a class="delete-btn" href="{% url 'courses:course-delete' obj.id %}">Delete</a>
如果用户单击并确认删除,它将从课程列表中删除该课程。
问题是为什么讲师要检查if id is not None:
?即使如果他从代码中忽略了这一点,它仍然可以正常工作。此外,“ id”为“无”的可能性为零,因为用户单击下面的表格,该链接会将用户引导到一条特定的路线,该路线最终删除了该路线。请帮助我理解这一点!
这是代码:
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'),
]
答案 0 :(得分:2)
我认为没有任何理由这样做,如果id
是None
,那么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。