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

要使用的模板的全名或模板名称的序列。如果给定序列,将使用存在的第一个模板。见 template loading documentation 有关如何找到模板的详细信息。

可选参数

context

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

content_type

用于结果文档的SME类型。默认为 'text/html'

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")

redirect()

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

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

参数可以是:

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

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

  • 用于重定向位置的绝对或相对URL。

默认情况下,临时重定向以302状态代码发出。如果 permanent=True ,永久重定向将发出301状态代码。

如果 preserve_request=True ,响应指示用户代理在发出重定向时保留原始请求的方法和主体。在这种情况下,临时重定向使用307状态代码,永久重定向使用308状态代码。下表更好地说明了这一点:

永久

preserve_request

HTTP状态代码

True

False

301

False

False

302

False

True

307

True

True

308

Changed in Django 5.2:

的论点 preserve_request 加入浓度

实例

你可以使用 redirect() 以多种方式发挥作用。

  1. 通过传递某个对象;该对象 get_absolute_url() 将调用方法以确定重定向URL::

    from django.shortcuts import redirect
    
    
    def my_view(request):
        ...
        obj = MyModel.objects.get(...)
        return redirect(obj)
    
  2. 通过传递视图的名称和一些位置或关键字参数(可选);将使用 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):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj, permanent=True)

另夕h preserve_request 参数可用于保留原始的HTTP方法:

def my_view(request):
    # ...
    obj = MyModel.objects.get(...)
    if request.method in ("POST", "PUT"):
        # Redirection preserves the original request method.
        return redirect(obj, preserve_request=True)
    # ...

get_object_or_404()

get_object_or_404(klass, *args, **kwargs)[源代码]
aget_object_or_404(klass, *args, **kwargs)

Asynchronous versionaget_object_or_404()

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

立论

klass

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

*args

Q objects

**kwargs

查找参数,其格式应为 get()filter() .

例子

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

from django.shortcuts import get_object_or_404


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

此示例等价于:

from django.http import Http404


def my_view(request):
    try:
        obj = 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() ,A MultipleObjectsReturned 如果找到多个对象,将引发异常。

get_list_or_404()

get_list_or_404(klass, *args, **kwargs)[源代码]
aget_list_or_404(klass, *args, **kwargs)

Asynchronous versionaget_list_or_404()

返回的结果 filter() 在一个给定的模型管理器上投射到一个列表,提升 Http404 如果结果列表为空。

立论

klass

A ModelManagerQuerySet 从中获取列表的实例。

*args

Q objects

**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.")