最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django的get_absolute_url方法的使用

 更新時(shí)間:2021年08月09日 10:42:36   作者:大江東流  
本文主要介紹了Django的get_absolute_url方法的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文主要的目的是通過一個簡單的例子,展示`get_absolute_url`的用法,拋磚引玉,理解實(shí)例方法的本質(zhì),能夠在不同的業(yè)務(wù)場景下,靈活多變,完成需求。

環(huán)境:Python3.8 + Django3.0

我們都知道,在反向解析url的時(shí)候,Django提供了三種方法,幫我們替代硬編碼的方式,也就是:

  • 在模板中:使用url模板標(biāo)簽。
  • 在Python代碼中:使用reverse()函數(shù)。
  • 在更高層的與處理Django模型實(shí)例相關(guān)的代碼中:使用get_absolute_url方法。

前面兩種方式比較常見,我們也很熟悉,但是最后的get_absolute_url方法,可能很多人就不明白具體如何使用了。下面我們通過一個簡單易懂的例子,來搞懂它的具體使用方法。

一、創(chuàng)建模型

首先,假設(shè)我們有下面的學(xué)生模型:

class Student(models.Model):

    sex_choice = [
        ('man', '男性'),
        ('woman', '女性'),
    ]

    name = models.CharField(max_length=128)
    sex = models.CharField(max_length=8, choices=sex_choice)
    tel = models.PositiveIntegerField()

    def __str__(self):
        return self.name

學(xué)生包含姓名、性別和電話。

不要忘記makemigrations和migrate。

然后我們接入admin后臺,隨意手動創(chuàng)建一些學(xué)生實(shí)例:

from django.contrib import admin
from app.models import Student


class StudentAdmin(admin.ModelAdmin):
    list_display = ['name', 'sex', 'tel']


admin.site.register(Student, StudentAdmin)

二、設(shè)計(jì)urls

我們編寫了下面的urls:

from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('students/', views.students),
    path('man/<int:id>/', views.man, name='man'),
    path('woman/<int:id>/', views.woman, name='woman'),
]

這里的students比較好理解,查看所有的學(xué)生列表。但是man和woman兩條路由的設(shè)計(jì)就屬于特殊需求了,按理說應(yīng)該直接一條路由即可,不就是查看某個具體學(xué)生的信息嘛。

但如果業(yè)務(wù)需求是這樣的:男生和女生必須使用不同的url進(jìn)行訪問!

那就只能這么分開編寫成兩條路由了。

注意url中的name屬性,用于后面的反向路由解析。

三、編寫視圖

我們編寫了下面的視圖,很簡單:

from django.shortcuts import render
from app import models


def students(request):
    s = models.Student.objects.all()
    return render(request, 'students.html', locals())


def man(request, id):
    student = models.Student.objects.get(id=id)
    return render(request, 'student.html', locals())


def woman(request, id):
    student = models.Student.objects.get(id=id)
    return render(request, 'student.html', locals())

四、HTML模板

首先看看student.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

        <p>name: {{ student.name }}</p>
        <p>sex: {{ student.sex }}</p>
        <p>tel: {{ student.tel }}</p>

</body>
</html>

很簡單,就是展示學(xué)生的信息,沒有需要關(guān)注的,僅僅用于表示運(yùn)行正常,信息顯示正確。

重點(diǎn)是students.html(多了個s,復(fù)數(shù)形式):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h4>歡迎訪問liujiangblog.com, 學(xué)習(xí)更多Django教程</h4>
    
    
{% for student in s %}    
    {% if student.sex == 'man' %}
        <p>
            姓名:{{ student.name }}   &nbsp;&nbsp;&nbsp;&nbsp;
            詳情:<a href="{% url 'man' student.id %}" rel="external nofollow" >{% url 'man' student.id %}</a>
        </p>
    {% else %}
        <p>
            姓名:{{ student.name }}   &nbsp;&nbsp;&nbsp;&nbsp;
            詳情:<a href="{% url 'woman' student.id %}" rel="external nofollow" >{% url 'woman' student.id %}</a>
        </p>
    {% endif %}    
{% endfor %}

</body>
</html>

通過if標(biāo)簽的判斷,決定最終生成的url是哪種。這里使用了Django內(nèi)置的url模板標(biāo)簽語法。

訪問students/頁面顯示結(jié)果:

點(diǎn)擊任何一條學(xué)生鏈接都可以正常跳轉(zhuǎn)到詳情頁面。

五、使用get_absolute_url方法

上面的代碼實(shí)現(xiàn)了業(yè)務(wù)需求,男生和女生自動生成了不一樣的url,而不是我們慣例的/student/,整個過程也很簡單,比較好理解。

但是,這里有個不足之處,那就是區(qū)分男女生的邏輯放在了HTML模板文件中,這不是個好的做法,也不優(yōu)雅。

實(shí)際上我們可以使用get_absolute_url方法,在Python代碼中實(shí)現(xiàn)這一功能。

首先,修改Student模型,添加get_absolute_url方法:

class Student(models.Model):

    sex_choice = [
        ('man', '男性'),
        ('woman', '女性'),
    ]

    name = models.CharField(max_length=128)
    sex = models.CharField(max_length=8, choices=sex_choice)
    tel = models.PositiveIntegerField()

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        from django.urls import reverse
        if self.sex == 'man':
            return reverse('man', args=(self.id,))
        else:
            return reverse('woman', args=(self.id,))

get_absolute_url方法中,我們導(dǎo)入了reverse,這是Django提供的反向解析功能。

reverse能避免我們對url進(jìn)行硬編碼,它接收多種類型的參數(shù),可以是一個視圖名,也可以是一個url的name。相關(guān)的參數(shù)通過args傳遞,這是一個元組,有順序。

上面的代碼中,通過if/else判斷,根據(jù)性別的不同,解析出男女生對應(yīng)的url。

然后,在students.html中,我們就可以修改成下面的樣子:

<body>
<h4>歡迎訪問liujiangblog.com, 學(xué)習(xí)更多Django教程</h4>

{% for student in s %}
    <p>
        姓名:{{ student.name }}   &nbsp;&nbsp;&nbsp;&nbsp;
        詳情:<a href="{{ student.get_absolute_url }}" rel="external nofollow" >{{ student.get_absolute_url }}</a>
    </p>
{% endfor %}

</body>

首先,沒有if/else模板標(biāo)簽了。其次使用{{ student.get_absolute_url }}來代替url模板標(biāo)簽。

student是Student模型類的一個實(shí)例,它可以訪問類中定義的get_absolute_url方法,從而進(jìn)入if/else判斷,然后根據(jù)性別的不同,reverse出不同的url字符串,并在HTML模板中展示出來。

整個HTML模板顯得更加簡潔優(yōu)雅,最后的頁面結(jié)果也是完全一樣的。實(shí)際上,這里也體現(xiàn)出了Django的模型層和模板層的高度配合。

六、總結(jié)思考

例子很簡單,無非就是在Student模型中添加了一個get_absolute_url方法。但是如果仔細(xì)思考一下我們會發(fā)現(xiàn)這里面有很多體現(xiàn)語言特點(diǎn)的東西:

Django本身沒有實(shí)現(xiàn)一個基本的get_absolute_url方法,在models.Model中也沒有get_absolute_url方法的影子,所以這個方法其實(shí)只是個思路,沒有實(shí)質(zhì)。

get_absolute_url方法本質(zhì)上只是一個類的實(shí)例方法,既然Django內(nèi)部的代碼沒有實(shí)現(xiàn)它,那么實(shí)際上我們可以給它任意命名,比如改成get_url。你可以試試,它絕對能正常工作。但要小心的是,Django核心源碼雖然沒有定義get_absolute_url方法,在admin后臺和feed框架等地方卻可能使用了這個get_absolute_url方法,所以在非必須時(shí),不要修改這個方法名。

繼續(xù)拓展思維,既然可以自定義get_absolute_url方法,那我可不可以在模型中添加任何我需要的實(shí)例方法呢?當(dāng)然可以!并且這是最強(qiáng)大最靈活的方式!比如根據(jù)用戶的不同,為模型添加一個user_control方法,提供不同的信息,控制訪問權(quán)限,切換頁面主題等等。

到此這篇關(guān)于Django的get_absolute_url方法的使用的文章就介紹到這了,更多相關(guān)Django get_absolute_url方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python機(jī)器學(xué)習(xí)pytorch自定義數(shù)據(jù)加載器

    python機(jī)器學(xué)習(xí)pytorch自定義數(shù)據(jù)加載器

    這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)pytorch自定義數(shù)據(jù)加載器使用示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • python 實(shí)現(xiàn)提取某個索引中某個時(shí)間段的數(shù)據(jù)方法

    python 實(shí)現(xiàn)提取某個索引中某個時(shí)間段的數(shù)據(jù)方法

    今天小編就為大家分享一篇python 實(shí)現(xiàn)提取某個索引中某個時(shí)間段的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python 生成圖形驗(yàn)證碼的方法示例

    python 生成圖形驗(yàn)證碼的方法示例

    日常在網(wǎng)站使用過程中經(jīng)常遇到圖形驗(yàn)證,這篇文章主要介紹了python 生成圖形驗(yàn)證碼的方法示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • 一文教會你調(diào)整Matplotlib子圖的大小

    一文教會你調(diào)整Matplotlib子圖的大小

    Matplotlib的可以把很多張圖畫到一個顯示界面,這就設(shè)計(jì)到面板切分成一個一個子圖,下面這篇文章主要給大家介紹了關(guān)于調(diào)整Matplotlib子圖大小的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Python實(shí)現(xiàn)爬取知乎神回復(fù)簡單爬蟲代碼分享

    Python實(shí)現(xiàn)爬取知乎神回復(fù)簡單爬蟲代碼分享

    這篇文章主要介紹了Python實(shí)現(xiàn)爬取知乎神回復(fù)簡單爬蟲代碼分享,本文實(shí)現(xiàn)了爬取知乎的“如何正確地吐槽”收藏夾,是對個人的一個興趣實(shí)現(xiàn),需要的朋友可以參考下
    2015-01-01
  • python實(shí)現(xiàn)的漢諾塔算法示例

    python實(shí)現(xiàn)的漢諾塔算法示例

    這篇文章主要介紹了python實(shí)現(xiàn)的漢諾塔算法,結(jié)合實(shí)例形式分析了漢諾塔算法的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • 計(jì)算機(jī)二級python學(xué)習(xí)教程(3) python語言基本數(shù)據(jù)類型

    計(jì)算機(jī)二級python學(xué)習(xí)教程(3) python語言基本數(shù)據(jù)類型

    這篇文章主要為大家詳細(xì)介紹了計(jì)算機(jī)二級python學(xué)習(xí)教程的第3篇,python語言基本數(shù)據(jù)類型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • python打包exe開機(jī)自動啟動的實(shí)例(windows)

    python打包exe開機(jī)自動啟動的實(shí)例(windows)

    今天小編就為大家分享一篇python打包exe開機(jī)自動啟動的實(shí)例(windows),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 詳解如何利用Python進(jìn)行客戶分群分析

    詳解如何利用Python進(jìn)行客戶分群分析

    每個電子商務(wù)數(shù)據(jù)分析師必須掌握的一項(xiàng)數(shù)據(jù)聚類技能,如果你是一名在電子商務(wù)公司工作的數(shù)據(jù)分析師,從客戶數(shù)據(jù)中挖掘潛在價(jià)值,來提高客戶留存率很可能就是你的工作任務(wù)之一。這篇就來告訴你如何將客戶分成不同的群組,并在一段時(shí)間內(nèi)觀察每個群組的留存率
    2023-02-02
  • 詳細(xì)講解Python中的文件I/O操作

    詳細(xì)講解Python中的文件I/O操作

    這篇文章主要介紹了Python中的文件I/O操作,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05

最新評論

上犹县| 丹江口市| 兴安盟| 郓城县| 临沭县| 高碑店市| 波密县| 读书| 凭祥市| 普安县| 梅河口市| 永昌县| 阿拉善右旗| 安丘市| 香港| 华蓥市| 定南县| 五河县| 宝兴县| 唐山市| 邵阳市| 无棣县| 若尔盖县| 灯塔市| 茌平县| 潼南县| 新竹县| 浠水县| 偏关县| 林芝县| 舟曲县| 绥阳县| 德江县| 湘阴县| 婺源县| 老河口市| 东海县| 哈巴河县| 吴忠市| 定州市| 天柱县|