包裹 django.shortcuts
收集帮助程序函数和类,这些函数和类“跨越”多个级别的MVC。换句话说,为了方便起见,这些函数/类引入了受控耦合。
render()
¶将给定模板与给定的上下文字典组合,并返回 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()
¶返回一个 HttpResponseRedirect
传递参数的相应URL。
参数可以是:
A模型:模型的 get_absolute_url()
将调用函数。
视图名称,可能带有参数: reverse()
将用于反向解析名称。
用于重定向位置的绝对或相对URL。
默认情况下,临时重定向以302状态代码发出。如果 permanent=True
,永久重定向将发出301状态代码。
如果 preserve_request=True
,响应指示用户代理在发出重定向时保留原始请求的方法和主体。在这种情况下,临时重定向使用307状态代码,永久重定向使用308状态代码。下表更好地说明了这一点:
永久 |
preserve_request |
HTTP状态代码 |
---|---|---|
|
|
301 |
|
|
302 |
|
|
307 |
|
|
308 |
的论点 preserve_request
加入浓度
你可以使用 redirect()
以多种方式发挥作用。
通过传递某个对象;该对象 get_absolute_url()
将调用方法以确定重定向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")
通过传递硬编码的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()
¶Asynchronous version : aget_object_or_404()
调用 get()
在给定的模型管理器上,但它会提高 Http404
而不是模型的 DoesNotExist
例外。
下面的示例从中获取主键为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()
¶Asynchronous version : 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.")
5月 28, 2025