HttpResponseDirect方法
- HttpResponseRedirect是django首選的URL重定向方法,在django.http模塊裏。該方法的第一個參數是必要的,是用來重定向的URL地址。這個URL可以是完整的鏈接(比如’http://www.baidu.com‘),也可以是一個不包含域名的靜態鏈接(例如‘/index/’)
- HttpReponseDirect只支持hard coded urls(硬編碼鏈接), 不能直接使用命名的URL,如使用HttpResponseDirect('blog:article_list‘)是錯誤的。在使用URL命名時,我們需要先通過URL反向解析方法reverse先對命名URL(article_list)進行解析,然後再使用HttpReponseRedirect定向(如下面的代碼)。
- 對於包含參數的URL(/article/2/new-day/),使用HttpResponseDirect定向前一般需要先使用reverse方法對命名的URL(如’article_detail’)進行解析,同時傳遞參數(如id, slug等)。
from .models import Article
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
from .forms import ArticleForm
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save()
return HttpResponseRedirect(reverse('blog:article_detail', args=[str(article.pk), article.slug]))
else:
form = ArticleForm()
return render(request, 'blog/article_create_form.html', {'form': form})
redirect方法
- redirect是URL重新定向的便捷方法,在django.shortcuts模塊裏。HttpResponseRedirect能支持的URL重定向,redirect都支持。比如下面3種重定向是redirect的常規用法。
from django.shortcuts import redirect
from django.urls import reverse
def my_view(request):
...
return redirect('/index/')
def my_view(request):
...
return redirect('https://www.baidu.com/')
def my_view(request):
...
return redirect(reverse('blog:article_list'))
- 除此之外,redirect還可以根據對象Object重定向和根據視圖view重定向,根據視圖重定向的時候還可以傳遞額外的參數。
- 根據對象Object重定向,使用該方法的前提是模型裏已經定義了get_asbolute_url方法,使用redirect會自動調用get_absolute_url方法。
from django.shortcuts import redirect
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj)
- 根據視圖view重定向,使用該方法的前提已對URL進行了命名,且對應了相應的視圖。下面案例中redirect會先根據視圖函數的名字查找對應url,在傳遞額外參數。後臺工作還是由reverse方法來完成的。
def my_view(request):
...
return redirect('some-view-name', foo='bar')
reverse方法
- reverse方法的作用是對已命名的URL進行反向解析,還傳遞相應的參數(args或帶key的參數kargs)。該方法位於django.urls模塊。
- 模型中自定義get_absolute_url,並傳遞參數args
def get_absolute_url(self):
return reverse('blog:article_detail', args=[str(self.pk), self.slug])
- 在視圖中配合URL重定向使用,並傳遞kargs
from django.urls import reverse
from django.shortcuts import redirect
def my_view(request):
...
return redirect(reverse('admin:app_list', kwargs={'app_label': 'auth'}))
作者:大江狗
來源:CSDN
原文:https://blog.csdn.net/weixin_42134789/article/details/81505963
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!