Skip to content

Latest commit

 

History

History
106 lines (52 loc) · 4.22 KB

404 and render.md

File metadata and controls

106 lines (52 loc) · 4.22 KB

一个快捷函数: get_object_or_404()

尝试用 get() 函数获取一个对象,如果不存在就抛出 Http404 错误也是一个普遍的流程。

也有 get_list_or_404() 函数,工作原理和 get_object_or_404() 一样,除了 get() 函数被换成了 filter() 函数。如果列表为空的话会抛出 Http404 异常。

为什么我们使用辅助函数 get_object_or_404() 而不是自己捕获 ObjectDoesNotExist 异常呢?还有,为什么模型 API 不直接抛出 ObjectDoesNotExist 而是抛出 Http404 呢?

因为这样做会增加模型层和视图层的耦合性。指导 Django 设计的最重要的思想之一就是要保证松散耦合。一些受控的耦合将会被包含在 django.shortcuts 模块中。

#不使用快捷函数
from django.http import Http404

from django.shortcuts import render



from .models import Question

\# ...

def detail(request, question_id):

  try:

    question = Question.objects.get(pk=question_id)

  except Question.DoesNotExist:

    raise Http404("Question does not exist")

  return render(request, 'polls/detail.html', {'question': question})
#使用快捷函数get_object_or_404()
from django.shortcuts import get_object_or_404, render

from .models import Question
# ...
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

一个快捷函数: render()

「载入模板,填充上下文,再返回由它生成的 HttpResponse 对象」是一个非常常用的操作流程。

The render() function takes the request object as its first argument, a template name as its second argument and a dictionary as its optional third argument. It returns an HttpResponse object of the given template rendered with the given context.

不使用render时:

from django.http import HttpResponse

from django.template import loader



from .models import Question



def index(request):

  latest_question_list = Question.objects.order_by('-pub_date')[:5]

   template = loader.get_template('polls/index.html')

  context = {

   'latest_question_list': latest_question_list,

  }

  return HttpResponse(template.render(context, request))

使用render函数

from django.shortcuts import render



from .models import Question



def index(request):

  latest_question_list = Question.objects.order_by('-pub_date')[:5]

  context = {'latest_question_list': latest_question_list}

  return render(request, 'polls/index.html', context)