快捷函數
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.")