Django views 中的 shortcut function

shortcut function都在django.shortcuts这个包中,主要包含有:render(), render_to_response(), redirect(), get_objects_or_404(), get_list_or_404()

1. render(request, template_name, context=None, context_instance=_context_instance_undefined, content_type=None, status=None, current_app=_current_app_undefined, dirs=_dirs_undefined, using=None)

返回一个HttpResponse对象,以及rendered 文本。

request, template_name是必选参数。

看官例:它指定模板为'myapp/index.html',内容类型为'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')

2. render_to_response(template_name, context=None, context_instance=_context_instance_undefined,
content_type=None, status=None, dirs=_dirs_undefined, using=None)

它与render基本类似,除了它不要求request参数,不推荐使用,而且在将来可能会被废弃,所以不多说。

3.redirect(to, permanent=False, *args, **kwargs)

返回HttpResponseRedirect 到一个合适的Url

参数可以是:

model:此时这个model的get_absolute_url()将被调用

a view name:(可带参数),此时urlresolvers.reverse会被调用

An absolute or relative URL:新的Url地址

默认情况下permanent=True会被发送,使其始终redirect

官例:

1.此时get_absolute_url()被调用来确定新的url

from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object)

2.此时reverse会被调用来处理url

def my_view(request):
...
return redirect('some-view-name', foo='bar')

3.redirect(),

def my_view(request):
...
return redirect('/some/url/')

  或者:

def my_view(request):
...
return redirect('https://example.com/')

redirect默认情况下返回结果是临时redirect,除非设置permanent=True,如下:

def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)

4.get_object_or_404(klass, *args, **kwargs)

通过给定的model manager调用get()方法,但返回Http404,而不是model的 DoesNotExist异常

klass 可以是 model, manager, QuerySet实例

官例:

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

最后 ,还可以是一个manager,特别是你自定义了manager时,(默认的manager就是objects)

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

你也可以用一个关联的manager:

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

但有一点需要注意,因为这里使用了get,那么可能返回多个对象,此时会出现:MultipleObjectsReturned异常!

5.get_list_or_404(klass, *args, **kwargs)

返回filter的结果列表,如果结果为空,则返回Http404

klass同上

官例:返回所有已经published的对象

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.")
上一篇:Starting zookeeper ... already running as process 1805错误


下一篇:GJM :用JIRA管理你的项目(三)基于LDAP用户管理 [转载]