Skip to main content

Django快捷方式的功能

django.shortcuts 收集帮助函数和“跨越”多级MVC的类。换句话说,为了方便起见,这些功能/类引入受控耦合。

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)[源代码]

将给定的模板与给定的上下文字典组合,并返回具有所渲染的文本的 HttpResponse 对象。

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

必需参数

request

用于生成此响应的请求对象。

template_name

要使用的模板的全名或模板名称序列。如果给出了序列,则将使用存在的第一个模板。有关如何找到模板的更多信息,请参阅 模板加载文档

可选参数

context

要添加到模板上下文的值的字典。默认情况下,这是一个空字典。如果字典中的值是可调用的,则视图将在渲染模板之前调用它。

content_type

用于生成文档的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。

status

响应的状态代码。默认为 200

using

用于加载模板的模板引擎的 NAME

以下示例呈现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_response(template_name, context=None, content_type=None, status=None, using=None)[源代码]

此功能在引入 render() 之前,并且工作类似,除了它不使 request 在响应中可用。它不推荐,并且很可能在将来被弃用。

redirect()

redirect(to, permanent=False, *args, **kwargs)[源代码]

HttpResponseRedirect 返回到传递的参数的相应网址。

参数可以是:

  • A模型:将调用模型的 get_absolute_url() 函数。

  • 视图名称,可能带有参数:reverse() 将用于反向解析名称。

  • 绝对或相对网址,将用于重定向位置。

默认情况下发出临时重定向;通过 permanent=True 发出永久重定向。

例子

您可以通过多种方式使用 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)[源代码]

在给定的模型管理器上调用 get(),但它提高了 Http404 而不是模型的 DoesNotExist 异常。

必需参数

klass

Model 类,Manager 或从中获取对象的 QuerySet 实例。

**kwargs

查找参数,应采用 get()filter() 接受的格式。

以下示例从 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)[源代码]

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

必需参数

klass

ModelManagerQuerySet 实例从中获取列表。

**kwargs

查找参数,应采用 get()filter() 接受的格式。

以下示例从 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.")