Django4.0 處理HTTP請(qǐng)求-Django便捷函數(shù)

2022-03-16 17:44 更新

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)

將給定的模板與給定的上下文字典組合在一起,并以渲染的文本返回一個(gè) ?HttpResponse ?對(duì)象。
Django沒有提供返回 ?TemplateResponse ?的便捷函數(shù),因?yàn)??TemplateResponse ?的構(gòu)造函數(shù)提供了與 ?render()? 同等程度的便利。

必選參數(shù)

request

用于生成此響應(yīng)的請(qǐng)求對(duì)象。

template_name

要使用的模板的全名或模板名稱的序列。如果給定一個(gè)序列,則將使用存在的第一個(gè)模板。

可選參數(shù)

context

要添加到模板上下文的值的字典。 默認(rèn)情況下,這是一個(gè)空的字典。 如果字典中的值是可調(diào)用的,則視圖將在渲染模板之前調(diào)用它。

content_type

用于結(jié)果文檔的 ?MIME類型。默認(rèn)?'text/html'? 。

status

響應(yīng)的狀態(tài)碼默認(rèn)為 200。

using

用于加載模板的模板引擎的 ?NAME。

例如:

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

這個(gè)例子相當(dāng)于:

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

redirect()

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

返回一個(gè) ?HttpResponseRedirect?,指向傳遞參數(shù)的適當(dāng) URL。
參數(shù)可以是:

  • 一個(gè)模型:模型的 ?get_absolute_url()? 函數(shù)將被調(diào)用。
  • 視圖名,可能帶有的參數(shù):?reverse()? 將被用于反向解析名稱。
  • 一個(gè)絕對(duì)或相對(duì) URL,將按原樣用作重定向位置。

默認(rèn)情況下發(fā)出臨時(shí)重定向;通過傳遞 ?permanent=True? 發(fā)出永久重定向。

例如:

你可以通過多種方法使用 ?redirect()? 函數(shù)。

1、傳遞對(duì)象,對(duì)象的 ?get_absolute_url()? 方法將被調(diào)用來指向重定向地址:

from django.shortcuts import redirect

def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj)

2、傳遞視圖名和一些可選的位置或關(guān)鍵字參數(shù);URL 將使用 ?reverse()? 方法來反向解析:

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

3、傳遞硬編碼 URL 來重定向:

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

這也適用于完整的 URL :

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

默認(rèn)情況下,?redirect() ?返回臨時(shí)重定向。所有以上形式都接受 ?permanent ?參數(shù);如果設(shè)置為 ?True ?會(huì)返回一個(gè)永久重定向:

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

get_object_or_404()

get_object_or_404(klass, *args, **kwargs)

在給定的模型管理器( model manager) 上調(diào)用 ?get()? ,但它會(huì)引發(fā) ?Http404 ?而不是模型的 ?DoesNotExist ?異常。

必選參數(shù)

klass

從中獲取對(duì)象的 ?Model ?類, ?Manager ?,或 ?QuerySet ?實(shí)例。

**kwargs

查詢參數(shù),應(yīng)采用 ?get()? 和 ?filter()? 接受的格式。

例如:

下面的例子是展示從 ?MyModel ?中獲取主鍵為1的對(duì)象:

from django.shortcuts import get_object_or_404

def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)

此示例相當(dāng)于:

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 ?。但是,你也可以傳遞一個(gè) ?QuerySet ?實(shí)例:

queryset = Book.objects.filter(title__startswith='M')
get_object_or_404(queryset, pk=1)

以上例子有點(diǎn)冗長,因?yàn)樗韧冢?/p>

get_object_or_404(Book, title__startswith='M', pk=1)

但如果你是從其他地方傳遞的 ?queryset ?變量,那它會(huì)很有用。
最后,你也可以使用 ?Manager ?。如果你有自定義管理器( ?custom manager? )會(huì)很有用:

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

你也可以使用關(guān)聯(lián)管理器( ?related managers? ):

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

注意:與 ?get()? 一樣,如果查詢結(jié)果有多個(gè)對(duì)象,那么會(huì)引發(fā) ?MultipleObjectsReturned ?異常。

get_list_or_404()

get_list_or_404(klass, *args, **kwargs)

返回給定模型管理器上 ?filter()? 轉(zhuǎn)換為列表的結(jié)果,如果結(jié)果列表為空,則引發(fā) ?Http404?。

必選參數(shù)

klass

從中獲取列表的 ?Model ?,?Manager ?或 ?QuerySet ?實(shí)例。

**kwargs

查詢參數(shù),應(yīng)采用 ?get()? 和 ?filter()? 接受的格式。

例如:

下面的例子展示從 ?MyModel ?中獲取所有 ?published=True? 的對(duì)象:

from django.shortcuts import get_list_or_404

def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

此示例相當(dāng)于:

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.")


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)