国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁 > 營銷資訊 > 建站知識 > Django URL重定向的3種方法詳解

Django URL重定向的3種方法詳解

時間:2023-02-09 10:42:01 | 來源:建站知識

時間:2023-02-09 10:42:01 來源:建站知識

最近收到很多讀者的鼓勵,非常開心,這給了我更多將公眾號持續(xù)更新下去的動力。今天還收到微信公眾號開通以來的第一份贊賞,在這里要特別感謝橘子同學(xué)。如果你學(xué)習(xí)的是Python Web開發(fā)和Django,本公眾號絕對不會讓你失望,我會爭取所有文章做到清晰易懂,原創(chuàng)免費。如果你是老鳥,本公眾號的內(nèi)容也可以作為系統(tǒng)性的參考資料。




利用django開發(fā)web應(yīng)用, 我們經(jīng)常需要進行URL重定向,有時候還需要給URL傳遞額外的參數(shù)。比如用戶添加文章完成后需要轉(zhuǎn)到文章列表或某篇文章詳情。因此熟練掌握HttpResponseDirect, redirect和reverse這三種方法對于Django Web開發(fā)是至關(guān)重要。今天小編我就帶你看下Django URL重定向的HttpResponseDirect, redirect和reverse方法的詳細用法。










HttpResponseDirect方法

HttpResponseRedirect是django首選的URL重定向方法,在django.http模塊里。該方法的第一個參數(shù)是必要的,是用來重定向的URL地址。這個URL可以是完整的鏈接(比如’http://www.baidu.com‘),也可以是一個不包含域名的靜態(tài)鏈接(例如‘/index/’)。




我們下面以新聞博客(blog)為例來看看如何使用HttpResponseDirect方法。假如我們有如下3個urls, 一個展示文章,一個添加文章,一個展示文章詳情。我們需要使用該方法在視圖中實現(xiàn)兩種URL重定向:

from django.urls import path, re_pathfrom . import views# namespaceapp_name = 'blog'urlpatterns = [ # 展示所有文章 path('/index/', views.ArticleListView.as_view(), name='article_list'), # 展示文章詳情 re_path(r'^article/(?P<pk>/d+)/(?P<slug1>[-/w]+)/$', views.ArticleDetailView.as_view(), name='article_detail'), # 添加文章 re_path(r'^article/create/$', views.ArticleCreateView.as_view(), name='article_create'),]


1. 在視圖views.py中利用HttpResponse重新定向至不含參數(shù)的URL

from .models import Article, from django.http import HttpResponseRedirectfrom django.shortcuts import renderfrom .forms import ArticleFormdef article_create(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect("/index/") else: form = ArticleForm() return render(request, 'blog/article_create_form.html', {'form': form})如果/index/頁面有分頁功能, 你還可以通過使用HttpResponseRedirect('/index/?page=2')直接獲取第2頁的文章列表。




HttpReponseDirect只支持hard coded urls(硬編碼鏈接), 不能直接使用命名的URL,如使用HttpResponseDirect('blog:article_list‘)是錯誤的。在使用URL命名時,我們需要先通過URL反向解析方法reverse先對命名URL(article_list)進行解析,然后再使用HttpReponseRedirect定向(如下面的代碼)。背后的邏輯是reverse('blog:article_list')='/index/'。

......from django.http import HttpResponseRedirectfrom django.urls import reverse.....def article_create(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect(reverse('blog:article_list')) ....


2. 在視圖views.py中利用HttpResponseDirect重新定向至包含參數(shù)的URL

對于包含參數(shù)的URL(/article/2/new-day/),使用HttpResponseDirect定向前一般需要先使用reverse方法對命名的URL(如'article_detail')進行解析,同時傳遞參數(shù)(如id, slug等)。

from .models import Articlefrom django.http import HttpResponseRedirectfrom django.urls import reversefrom django.shortcuts import renderfrom .forms import ArticleFormdef 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})


其中最重要的一行代碼如下所示。大家可以仔細看下參數(shù)是如何傳遞到url的。

reverse('blog:article_detail', args=[str(article.pk), article.slug]


redirect方法

redirect是URL重新定向的便捷方法,在django.shortcuts模塊里。HttpResponseRedirect能支持的URL重定向,redirect都支持。比如下面3種重定向是redirect的常規(guī)用法。

from django.shortcuts import redirectfrom django.urls import reverse# 案例1def my_view(request): ... return redirect('/index/')# 案例2def my_view(request): ... return redirect('https://www.baidu.com/')# 案例3def my_view(request): ... return redirect(reverse('blog:article_list'))redirect真正NB的地方在于,它不僅能根據(jù)URL重定向,還可以根據(jù)對象Object重定向和根據(jù)視圖view重定向,根據(jù)視圖重定向的時候還可以傳遞額外的參數(shù)。




1. 根據(jù)對象Object重定向

使用該方法的前提是模型里已經(jīng)定義了get_asbolute_url方法,使用redirect會自動調(diào)用get_absolute_url方法。


from django.shortcuts import redirectdef my_view(request): ... obj = MyModel.objects.get(...) return redirect(obj)


2. 根據(jù)視圖view重定向

使用該方法的前提已對URL進行了命名,且對應(yīng)了相應(yīng)的視圖。下面案例中redirect會先根據(jù)視圖函數(shù)的名字查找對應(yīng)url,在傳遞額外參數(shù)。后臺工作還是由reverse方法來完成的。

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


reverse方法

reverse方法的作用是對已命名的URL進行反向解析,還傳遞相應(yīng)的參數(shù)(args或帶key的參數(shù)kargs)。該方法位于django.urls模塊。reverse方法一般有2種應(yīng)用場景:




1. 模型中自定義get_absolute_url,并傳遞參數(shù)args

def get_absolute_url(self): return reverse('blog:article_detail', args=[str(self.pk), self.slug])


2. 在視圖中配合URL重定向使用,并傳遞kargs

from django.urls import reversefrom django.shortcuts import redirectdef my_view(request): ... return redirect(reverse('admin:app_list', kwargs={'app_label': 'auth'}))


還有一點容易被人們忽略的是reverse方法不僅能對命名的urls進行反向解析,還可以對視圖函數(shù)進行反向解析,找到需要重新定向的url, 如下面代碼所示。當然但這個方法我們并不推薦使用。與此功能相反的是resolve方法,該方法可以根據(jù)url找到對應(yīng)視圖函數(shù)。

from django.urls import reversefrom blog import viewsreverse(views.index)


小結(jié)

HttpResponseDirect, redirect和reverse三個方法都非常常用,在使用它們前忘了import進來哦。注意它們在不同的模塊。




周六上午這么快就沒了,希望本文對你有所幫助。明日打算講解formset的用法,并分享實際應(yīng)用案例。碼字不易,歡迎轉(zhuǎn)載點贊。來自微信公眾號【Python與Django大咖之路】

關(guān)鍵詞:方法

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉