看三种写法:
【1】最原始的,不处理404
def one_note(request, pk): date_and_tag() pk_note = MyNote.objects.get(id=pk) all_comment = pk_note.comment_set.all() context = {'pk_note': pk_note, 'date_index': list(set(date_list)), 'tag_index': list(set(tag_list)), 'all_comment': all_comment} return render(request, 'one_note.html', context)
【2】使用try--except
def one_note(request, pk): date_and_tag() try: pk_note = MyNote.objects.get(id=pk) except MyNote.DoesNotExist: raise Http404("MyNote does not exist")
# 如果try通过,则跳过except,继续执行下面的内容 all_comment = pk_note.comment_set.all() context = {'pk_note': pk_note, 'date_index': list(set(date_list)), 'tag_index': list(set(tag_list)), 'all_comment': all_comment} return render(request, 'one_note.html', context)
【3】使用快捷方式:get_object_or_404()
def one_note(request, pk): date_and_tag() # pk_note = MyNote.objects.get(id=pk) pk_note = get_object_or_404(MyNote, id=pk) all_comment = pk_note.comment_set.all() context = {'pk_note': pk_note, 'date_index': list(set(date_list)), 'tag_index': list(set(tag_list)), 'all_comment': all_comment} return render(request, 'one_note.html', context)
django官方文档(version:3.0)的解释是:
为什么我们使用辅助函数get_object_or_404()
而不是Object.DoesNotExist
在较高级别上自动捕获异常,或者使用API抛出Http404(更高级)
代替Object.DoesNotExist
?
因为那样会将模型层耦合到视图层。
Django的首要设计目标之一是保持松散耦合。在django.shortcuts
模块中引入了一些受控耦合。观察以下引用:
from django.shortcuts import render, get_object_or_404 from .models import MyNote, Comment from .forms import NoteForm from django.http import HttpResponseRedirect, Http404 from django.urls import reverse