django1.8 view(4): shortcuts function

本文翻译自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)
  1. 传递视图的名字和一些可选的位置参数,关键字参数;the URL will be reverse resolved using the reverse() method:
def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')
  1. 传递硬编码的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.')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值