Django的快捷函数

The package django.shortcuts collects helper functions and classes that “span” multiple levels of MVC. 换句话说,为了方便,这些函数/类引入了受控耦合。

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)[source]

将给定的模板与给定的上下文字典组合起来,并返回带有该呈现文本的HttpResponse对象。

Django不提供返回TemplateResponse的快捷方式函数,因为TemplateResponse的构造函数提供了与render()相同的方便程度。

必需参数

请求
用于生成此响应的请求对象。
TEMPLATE_NAME
要使用的模板的全名或模板名称的序列。 如果给出了一个序列,将使用存在的第一个模板。 有关如何找到模板的更多信息,请参阅template loading documentation

可选参数

上下文
要添加到模板上下文的值的字典。 默认情况下,这是一个空字典。 如果字典中的值是可调用的,视图将在渲染模板之前调用它。
内容类型
用于生成文档的MIME类型。 默认为DEFAULT_CONTENT_TYPE设置的值。
状态
响应的状态码。 默认为200
运用
用于加载模板的模板引擎的NAME

实施例¶ T0>

以下示例使用MIME类型application / xhtml + xml呈现模板myapp/index.html

from django.shortcuts import render

def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {
        'foo': 'bar',
    }, content_type='application/xhtml+xml')

这个例子相当于:

from django.http import HttpResponse
from django.template import loader

def my_view(request):
    # View code here...
    t = loader.get_template('myapp/index.html')
    c = {'foo': 'bar'}
    return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')

render_to_response()

render_to_responsetemplate_namecontext = Nonecontent_type = Nonestatus = Noneusing = None[source]

自2.0版以来已弃用。

这个函数在引入render()之前,除了不会使响应中的request可用外,其他的工作方式都是相同的。

redirect()

redirect(to, permanent=False, *args, **kwargs)[source]

HttpResponseRedirect返回给传递参数的相应URL。

争论可能是:

  • 模型:模型的get_absolute_url()函数将被调用。
  • 视图名称,可能带有参数:reverse()将用于反向解析名称。
  • 绝对或相对URL,将用于重定向位置。

默认情况下发出临时重定向;传递permanent=True来发出永久重定向。

实例¶ T0>

您可以通过多种方式使用redirect()函数。

  1. 通过传递一些对象;该对象的get_absolute_url()方法将被调用以找出重定向URL:

    from django.shortcuts import redirect
    
    def my_view(request):
        ...
        object = MyModel.objects.get(...)
        return redirect(object)
    
  2. 通过传递一个视图的名称和可选的一些位置或关键字参数; URL将使用reverse()方法反向解析:

    def my_view(request):
        ...
        return redirect('some-view-name', foo='bar')
    
  3. 通过传递一个硬编码的URL重定向到:

    def my_view(request):
        ...
        return redirect('/some/url/')
    

    这也适用于完整的网址:

    def my_view(request):
        ...
        return redirect('https://example.com/')
    

默认情况下,redirect()返回一个临时重定向。 所有上述形式接受permanent参数;如果设置为True,则将返回永久重定向:

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True)

get_object_or_404()

get_object_or_404(klass, *args, **kwargs)[source]

在给定的模型管理器上调用get(),但是会引发Http404而不是模型的DoesNotExist异常。

必需参数

克拉斯
一个Model类,一个Manager或一个QuerySet实例。
** kwargs
查找参数应该采用get()filter()接受的格式。

实施例¶ T0>

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

from django.shortcuts import get_object_or_404

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

这个例子相当于:

from django.http import Http404

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

最常见的用例是传递Model,如上所示。 但是,您也可以传递一个QuerySet实例:

queryset = Book.objects.filter(title__startswith='M')
get_object_or_404(queryset, pk=1)

上面的例子有点做作,因为它相当于:

get_object_or_404(Book, title__startswith='M', pk=1)

但是如果您从其他地方传递了queryset变量​​,那么它会很有用。

最后,你也可以使用Manager 例如,如果您有custom manager,这是很有用的:

get_object_or_404(Book.dahl_objects, title='Matilda')

您也可以使用related managers

author = Author.objects.get(name='Roald Dahl')
get_object_or_404(author.book_set, title='Matilda')

注意:与get()一样,如果找到多个对象,则会引发MultipleObjectsReturned异常。

get_list_or_404()

get_list_or_404(klass, *args, **kwargs)[source]

将给定模型管理器上的filter()的结果转换为列表,如果结果列表为空,则返回Http404

必需参数

克拉斯
一个ModelManagerQuerySet实例从中获取列表。
** kwargs
查找参数应该采用get()filter()接受的格式。

实施例¶ T0>

以下示例从MyModel获取所有发布的对象:

from django.shortcuts import get_list_or_404

def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

这个例子相当于:

from django.http import Http404

def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404("No MyModel matches the given query.")