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.")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章