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()
函式。
透過傳遞某個物件;將呼叫該物件的
get_absolute_url()
方法以找出重新導向網址from django.shortcuts import redirect def my_view(request): ... obj = MyModel.objects.get(...) return redirect(obj)
透過傳遞視圖的名稱,並可選擇一些位置或關鍵字參數;將使用
reverse()
方法反向解析網址def my_view(request): ... return redirect("some-view-name", foo="bar")
透過傳遞要重新導向的硬式編碼網址
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()
¶
- aget_object_or_404(klass, *args, **kwargs)¶
非同步版本:
aget_object_or_404()
呼叫給定模型管理員的
get()
,但會引發Http404
,而不是模型的DoesNotExist
例外。
參數¶
範例¶
以下範例從 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
異常。
新增了 aget_object_or_404()
函式。
get_list_or_404()
¶
- aget_list_or_404(klass, *args, **kwargs)¶
非同步版本:
aget_list_or_404()
參數¶
範例¶
以下範例從 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.")
新增了 aget_list_or_404()
函式。