快捷函数
django.shortcuts包收集了“跨越”多级MVC的辅助函数和类。换句话说,为方便起见,这些函数/类引入了受控耦合。
1. render()
render(request, template_name, context=None, content_type=None, status=None, using=None)
将给定模板与给定的上下文字典组合,并返回渲染后的HttpResponse文本对象。
Django没有提供返回 TemplateResponse 的快捷函数,因为TemplateResponse构造函数提供了和render()相同的便利性。
1.1 必需参数
request
用于生成此响应的请求对象。
template_name
要使用的模板的全名或模板名称的序列。如果给出序列,则将使用存在的第一个模板。有关如何找到模板的更多信息,请参阅 模板加载 文档。
1.2 可选参数
context
要添加到模板上下文的字典。默认情况下,这是一个空字典
。如果字典中的值是可调用的,则视图将在呈现模板之前调用它。
content_type
用于生成的文档的MIME类型。默认为设置文件中DEFAULT_CONTENT_TYPE的值(默认为'text/html'
)。
status
响应的状态代码。默认为200
。
using
使用NAME模板引擎来加载模板。
1.3 示例
以下示例使用 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')
2. render_to_response()
render_to_response(template_name, context=None, content_type=None, status=None, using=None)
自2.0版以来已弃用。
3.redirect()
redirect(to, permanent=False, *args, **kwargs)
使用相应URL传递的参数返回 HttpResponseRedirect
参数可能是:
- 模型:将调用模型的 get_absolute_url() 函数。
- 视图名称(可能带参数) : 将用 reverse()进行反向解析名称。
- 绝对或相对URL,将用作重定向
默认情况下会发出临时重定向; permanent=True
表示永久重定向。
3.1 示例
您可以在多种场合使用redirect()功能。
1 . 传递一些对象; 将调用该对象的 get_absolute_url()方法来确定重定向URL:
# views.py
from django.shortcuts import redirect
def test_redirect_1(request):
#...
obj = Publish.objects.get(nid=1)
return redirect(obj)
# models.py
class Publish(models.Model):
# ...
def get_absolute_url(self):
return '/polls/publish'
# urls.py
path('test_redirect_1/',views.test_redirect_1,name='test_redirect_1')
结果如下,由test_redirect_1/
跳转到/polls/publish
,状态码是302:
修改代码为 return redirect(obj,permanent=True)
,状态码是301:
2 . 传递视图的名称和一些可选的位置或关键字参数; 将使用reverse()方法反向解析URL :
def my_view(request):
...
return redirect('some-view-name', foo='bar')
译者实例:
# views.py
def test_redirect_2(request,name):
return HttpResponse("you catcha me"+name)
def test_redirect_3(request):
return redirect('polls:test_redirect_2','leng')
# urls.py
path('test_redirect_2/<name>/',views.test_redirect_2,name='test_redirect_2'),
path('test_redirect_3/',views.test_redirect_3,name='test_redirect_3'),
访问test_redirect_3/
,结果
3 . 通过传递硬编码的URL来重定向:
def my_view(request):
...
return redirect('/some/url/')
这也适用于完整的URL:
def my_view(request):
...
return redirect('https://example.com/')
默认情况下,redirect()返回临时重定向。 如果设置为True将返回永久重定向
4. get_object_or_404()
get_object_or_404(klass, *args, **kwargs)
在给定的模型管理器上调用get(),但它会引发Http404而不是模型的 DoesNotExist异常。
4.1 必需参数
klass
一个Model类,Manager,或一个对象的QuerySet实例。
**kwargs
查找参数,应采用 get() 和 filter() 接受的格式。
4.2 示例
以下示例从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')
您还可以使用 related managers:
author = Author.objects.get(name='Roald Dahl')
get_object_or_404(author.book_set, title='Matilda')
注意:和get()一样,如果找到多个对象, 将引发MultipleObjectsReturned异常。
5. get_list_or_404()
get_list_or_404(klass, *args, **kwargs)
将给定模型管理器执行filter()后的结果转换为列表,如果结果列表为空则引发Http404。
5.1 必需参数
klass
Model,Manager或 QuerySet实例。
**kwargs
查找参数,应采用get()和filter() 接受的格式。
5.2 示例
以下示例获取所有已发布的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.")