本文翻译自django1.8.2官方文档中The view layer的Shrotcuts段
django shortcut functions
包django.shortcuts收集了一些有用的函数和类,贯穿了MVC的多个部分.意思就是,这些函数/类提供了方便的途径控制耦合.
render
- render(request, template_name[, context][, context_instance][, content_type][, status][, current_app][, dirs][, using])
结合一个给定的模板和一个给定的上下文字典,返回有着渲染后的文本的HttpResponse字典.
render()和render_to_response()一样,都需要context_instance参数,必须使用RequestContext.
django没有提供返回TemplateResponse的快捷方式函数,因为TemplateResponse的构造器提供了像render()一样方便的方法.
Required arguments
- request
用于生成此响应的请求对象 - template_name
要使用的模板的全名或模板名称序列
Optional arguments
context
要添加到模板上下文的字典.默认是一个空字典.如果字典里有值可调用,视图会在渲染模板前先调用.django1.8更改
上下文参数以前称为字典.这个名称在djang1.8里不推荐使用,在django2.0里将会移除.
context_instance
要渲染到模板的上下文实例.默认情况下,模板渲染使用RequestContext实例(填充request和context里的值).
**从版本1.8开始就不推荐使用:**context_instance不推荐使用,使用context更简单content_type
用于生成文档的MIME类型.默认是DEFAULT_CONTENT_TYPE设置的值.status
响应的状态码.默认是200.current_app
说明哪个应用包含现在的视图的提示信息.详情请看namespaced URL resolution strategy.
从1.8版本开始不推荐使用:不推荐使用current_app.推荐使用设置request.current_app.using
加载模板所使用的模板引擎的名字.
Example
下面的例子使用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 RequestContext, loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = RequestContext(request, {'foo': 'bar'})
return HttpResponse(t.render(c),
content_type='application/xhtml+xml')
render_to_response
- render_to_response(template_name[, context][, context_instance][, context_type][, status][, dirs][, using])
用指定的上下文字典渲染一个给定的模板并且返回渲染后的文本的HttpResponse对象
Required arguments
- template_name
模板的全名或模板名序列.如果是序列,会使用第一个存在的模板.怎么寻找模板的详情请看template loading documentation
Optional arguments
context
加入到模板上下文的字典.默认是空字典.如果字典内的值可用,视图会在渲染模板前先调用它.django1.8更改:
context变量之前的版本是一个可调用的字典.这个名称django1.8不推荐使用,django2.0将移除context_instance
渲染到模板的上下文实例.默认,模板会由上下文实例(由context的值来填充)渲染.如果你要使用context processors,就用RequestContext实例来渲染模板.你的代码就会想下面这样:
return render_to_response('my_template.html',
my_context,
context_instance=RequestContext(request))
**django1.8不推荐使用:**context_instance变量不推荐使用.使用context更简单.
content_type
结果文档的MIME类型.默认值是DEFAULT_CONTENT_TYPE的值.status
响应的状态码.默认是200.using
使用的模板引擎的名称.
django1.8更改:
新增status和using变量django1.7更改:
新增dirs变量从1.8开始不推荐:
dirs变来那个不推荐使用
Example
下面的例子使用MIME类型application/xhtml+xml来渲染模板 myapp/index.html
from django.shortcuts import render_to_response
def my_view(request):
# View code here...
return render_to_response('myapp/index.html', {'foo': 'bar'}, content_type='application/xhtml+xml')
这个例子等同于:
from django.http import HttpResponse
from django.template import Context, loader
def my_view(request):
# view code here...
t = loader.get_template('myapp/index.html')
c = Context({'foo', 'bar'})
return HttpResponse(t.render(c), content_type='application/xhtml+xml')
redirect
redirect(to, [permanent=False,]*args, **kwargs)
返回HttpResponseRedirect,指向参数传递的URL
参数可以是:
- 一个模型: 模型的get_absolute_url()方法必须可调用.
- 一个视图名: urlresolvers.reverse参数会被用于reverse_resolve the name.
- 一个绝对或相对URL,跳转路径会使用.
默认,建议使用临时的跳转,如果要使用固定的跳转,传参parmanent=True.
django1.7更改:
新增可以使用相对路径.
Example
你有几种方法来使用redirect()函数.
1. 传递某种对象;对象的get_absolute_url()方法可以被调用,来计算出重定向URL:
from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object)
- 传递视图的名字和一些可选的位置参数,关键字参数;the URL will be reverse resolved using the reverse() method:
def my_view(request):
...
return redirect('some-view-name', foo='bar')
- 传递硬编码的URL来跳转:
def my_view(request):
...
return redirect('/some/ur')
或者使用完整的URL:
def my_view(request):
...
return redirect('http://example.com/')
默认,redirect返回一个临时跳转.上面的形式接受一个permanent参数;如果设置为True,会return一个固定的跳转.
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
get_object_or_404
- get_object_or_404(klass, *args, **kwargs)
调用一个model manager的get()方法,但是他会抛出Http404错误,而不是model的DoesNotExist异常.
Required arguments
klass
一个Model类,一个Manager,或者QuerySet实例.**kwargs
查找参数,get()和filter()接受的参数的格式.
Example
下面的例子是从获得MyModel的主键为1的对象:
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
这个例子等同于:
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raist Http404('no mymodel matches the given query.')
最常见的使用方法是传递一个Model参数,就像上面一样.但是,你也可以传递一个QuerySet实例:
queryset = Book.objects.filter(title_startwith='M')
get_object_or_404(queryset, pk=1)
上面的例子有点造作,因为它相当于:
get_object_or_404(Book,title_startswith='M', pk=1)
你也可以是用related_managers:
author = Author.objects.get(name='Roald Dahl')
get_object_or_404(author.book_set, title='Matilda')
注意:使用get()时,如果找到了不止一个对象,会抛出MultipleObjectReturned异常.
get_list_or_404
- get_list_or_404(klass, *args, **kwargs)
返回一个model manager经过filter()后的结果集转换成list,如果结果集是空的,就抛出Http404异常.
Required arguments
klass
一个Model,Manager或QuerySet实例.**kwargs
查找参数,get()和filter()接受的参数的格式.
Example
下面的例子是获取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.')