Django 2.1.3 视图层 快捷函数

视图函数 | 总目录| 装饰器


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.")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值