Django的快捷函数

django.shortcuts 收集了“跨越” 多层MVC 的辅助函数和类。 换句话讲,这些函数/类为了方便,引入了可控的耦合。

render()

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

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

Django 不提供返回TemplateResponse 的快捷函数,因为TemplateResponse 的构造与render() 提供的便利是一个层次的。

必需参数

request
该request用于生成response
template_name
要使用的模板的完整名称或者模板名称的一个序列。 如果给出的是一个序列,将使用存在的第一个模板。 关于如何查找模板的更多信息请参见 template loading documentation

可选参数

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

示例

下面的示例渲染模板myapp/index.html,MIME 类型为application/xhtml+xml

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)[source]

此功能在引入render()之前进行,除了不能使request可用于响应之外,它的工作方式类似。 不推荐,以后可能会被弃用。

redirect()

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

为传递进来的参数返回HttpResponseRedirect 给正确的URL 。

参数可以是:

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

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

示例

你可以用多种方式使用redirect() 函数。

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

    from django.shortcuts import 重定向
    
    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/')
    

    也可以是一个完整的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 异常。

必需参数

klass
获取该对象的一个Model 类,ManagerQuerySet 实例。
**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)[source]

返回一个给定模型管理器上filter() 的结果,并将结果映射为一个列表,如果结果为空则返回Http404

必需参数

klass
获取该列表的一个ModelManagerQuerySet 实例。
**kwargs
查询的参数,格式应该可以被get()filter()接受。

示例

下面的示例从MyModel 中获取所有发布出来的对象:

from django.shortcuts import 得到列表或返回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.")