當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Django Model.get_absolute_url用法及代碼示例


本文介紹 django.db.models.Model.get_absolute_url 的用法。

聲明

Model.get_absolute_url()

定義 get_absolute_url() 方法來告訴 Django 如何計算對象的規範 URL。對於調用者,該方法應該返回一個字符串,該字符串可用於通過 HTTP 引用該對象。

例如:

def get_absolute_url(self):
    return "/people/%i/" % self.id

盡管此代碼正確且簡單,但它可能不是編寫此類方法的最可移植的方式。 reverse() 函數通常是最好的方法。

例如:

def get_absolute_url(self):
    from django.urls import reverse
    return reverse('people-detail', kwargs={'pk' : self.pk})

Django 使用get_absolute_url() 的地方之一是在管理應用程序中。如果對象定義了此方法,object-editing 頁麵將有一個 “View on site” 鏈接,該鏈接將直接跳轉到對象的公共視圖,如 get_absolute_url() 所示。

類似地,Django 的一些其他位,例如聯合提要框架,在定義時使用get_absolute_url()。如果你的模型實例每個都有一個唯一的 URL 是有意義的,你應該定義 get_absolute_url()

警告

您應該避免從未經驗證的用戶輸入構建 URL,以減少鏈接或重定向中毒的可能性:

def get_absolute_url(self):
    return '/%s/' % self.name

如果 self.name'/example.com' 這將返回 '//example.com/' ,它又是一個有效的架構相對 URL,但不是預期的 '/%2Fexample.com/'

最好在模板中使用get_absolute_url(),而不是hard-coding 對象的 URL。例如,這個模板代碼很糟糕:

<!-- BAD template code. Avoid! -->
<a href="/people/{{ object.id }}/">{{ object.name }}</a>

這個模板代碼要好得多:

<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>

這裏的邏輯是,如果您更改對象的 URL 結構,即使是為了更正拚寫錯誤之類的小事,您也不希望必須跟蹤可能創建 URL 的每個位置。在get_absolute_url() 中指定一次,然後讓所有其他代碼調用該位置。

注意

您返回的字符串get_absolute_url() 必須僅包含 ASCII 字符(URI 規範要求,RFC 2396#section-2) 並在必要時進行 URL 編碼。

調用get_absolute_url() 的代碼和模板應該能夠直接使用結果而無需任何進一步處理。如果您使用的字符串包含 ASCII 範圍之外的字符,您可能希望使用 django.utils.encoding.iri_to_uri() 函數來幫助解決此問題。

相關用法


注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.db.models.Model.get_absolute_url。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。