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 類型。預設為 'text/html'

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

redirect()

redirect(to, *args, permanent=False, **kwargs)[原始碼]

傳回一個 HttpResponseRedirect,其網址對應於傳入的參數。

參數可以是

  • 模型:將呼叫模型的 get_absolute_url() 函式。

  • 視圖名稱,可能帶有參數:將使用 reverse() 反向解析名稱。

  • 絕對或相對網址,將按原樣用於重新導向位置。

預設發出臨時重新導向;傳遞 permanent=True 以發出永久重新導向。

範例

您可以使用多種方式使用 redirect() 函式。

  1. 透過傳遞某個物件;將呼叫該物件的 get_absolute_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. 透過傳遞要重新導向的硬式編碼網址

    def my_view(request):
        ...
        return redirect("/some/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)

get_object_or_404()

get_object_or_404(klass, *args, **kwargs)[原始碼]
aget_object_or_404(klass, *args, **kwargs)

非同步版本aget_object_or_404()

呼叫給定模型管理員的 get(),但會引發 Http404,而不是模型的 DoesNotExist 例外。

參數

klass

要從中取得物件的 Model 類別、ManagerQuerySet 執行個體。

*args

Q 物件.

**kwargs

查閱參數,其格式應符合 get()filter() 接受的格式。

範例

以下範例從 MyModel 取得主鍵為 1 的物件

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。例如,如果您有自訂管理員,這會很有用

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

您也可以使用 相關 管理員

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

注意:如同 get(),如果找到多個物件,將會引發 MultipleObjectsReturned 異常。

在 Django 5.0 中變更

新增了 aget_object_or_404() 函式。

get_list_or_404()

get_list_or_404(klass, *args, **kwargs)[原始碼]
aget_list_or_404(klass, *args, **kwargs)

非同步版本aget_list_or_404()

返回在給定的模型管理器上執行 filter() 並轉換為列表的結果,如果結果列表為空,則引發 Http404

參數

klass

一個 ModelManagerQuerySet 實例,用於從中獲取列表。

*args

Q 物件.

**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.")
在 Django 5.0 中變更

新增了 aget_list_or_404() 函式。

返回頂部