zoukankan      html  css  js  c++  java
  • 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.")
    
  • 相关阅读:
    【译】x86程序员手册30-8.2 I/O指令
    【译】x86程序员手册29-第8章 输入输出
    【译】x86程序员手册28-7.7任务地址空间
    【译】x86程序员手册27-7.6任务链
    【译】x86程序员手册26-7.5任务切换
    【译】x86程序员手册25-7.1任务状态段
    【译】x86程序员手册23-6.5组合页与段保护
    【译】x86程序员手册24-第7章 多任务
    【译】x86程序员手册22-6.4页级保护
    WPF Blend Grid 布局
  • 原文地址:https://www.cnblogs.com/Andy963/p/5790238.html
Copyright © 2011-2022 走看看