成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術(shù)文章
文章詳情頁

Django的get_absolute_url方法的使用

瀏覽:89日期:2024-09-03 11:21:13
目錄一、創(chuàng)建模型二、設(shè)計urls三、編寫視圖四、HTML模板五、使用get_absolute_url方法六、總結(jié)思考

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

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

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

在模板中:使用url模板標(biāo)簽。 在Python代碼中:使用reverse()函數(shù)。 在更高層的與處理Django模型實例相關(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é)生實例:

from django.contrib import adminfrom app.models import Studentclass StudentAdmin(admin.ModelAdmin): list_display = [’name’, ’sex’, ’tel’]admin.site.register(Student, StudentAdmin)

Django的get_absolute_url方法的使用

二、設(shè)計urls

我們編寫了下面的urls:

from django.contrib import adminfrom django.urls import pathfrom app import viewsurlpatterns = [ 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è)計就屬于特殊需求了,按理說應(yīng)該直接一條路由即可,不就是查看某個具體學(xué)生的信息嘛。

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

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

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

三、編寫視圖

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

from django.shortcuts import renderfrom app import modelsdef 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)注的,僅僅用于表示運行正常,信息顯示正確。

重點是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='http://m.cgvv.com.cn/bcjs/{% url ’man’ student.id %}' rel='external nofollow' >{% url ’man’ student.id %}</a></p> {% else %}<p> 姓名:{{ student.name }} &nbsp;&nbsp;&nbsp;&nbsp; 詳情:<a href='http://m.cgvv.com.cn/bcjs/{% 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é)果:

Django的get_absolute_url方法的使用

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

五、使用get_absolute_url方法

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

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

實際上我們可以使用get_absolute_url方法,在Python代碼中實現(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 reverseif 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進行硬編碼,它接收多種類型的參數(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='http://m.cgvv.com.cn/bcjs/{{ 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模型類的一個實例,它可以訪問類中定義的get_absolute_url方法,從而進入if/else判斷,然后根據(jù)性別的不同,reverse出不同的url字符串,并在HTML模板中展示出來。

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

六、總結(jié)思考

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

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

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

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

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

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 国产亚洲欧美日韩综合综合二区 | 欧美黑寡妇特a级做爰 | 亚洲国产一区二区三区综合片 | 国产精品亚洲精品爽爽 | 在线观看成年视频 | 国产精品99久久99久久久看片 | 欧美不卡在线视频 | 亚洲综合久 | 亚洲日本aⅴ片在线观看香蕉 | 亚洲高清在线观看看片 | 国产精品午夜性视频网站 | 深夜福利爽爽爽动态图 | 欧美成人全部费免网站 | 亚洲国产高清在线 | cao在线| 依人久久 | 欧美视频自拍偷拍 | 亚洲成人看片 | www.精品| 最新更新国内自拍视频 | 日韩一级影院 | 久久精品全国免费观看国产 | 色综合久久88色综合天天小说 | 特级毛片aaaa级毛片免费 | 一级做a爱片久久毛片 | 欧美xxxx成人免费网站 | 亚洲欧美自拍偷拍 | 国产毛片久久国产 | 欧美色性 | 国产美女拍拍拍在线观看 | 久久久久国产精品免费看 | 91精品国产综合久久青草 | 亚洲欧美在线观看视频 | 国产成人一区二区三区高清 | 日韩亚洲成a人片在线观看 日韩亚洲精品不卡在线 | 一区二区三区免费视频网站 | 欧美日本一区亚洲欧美一区 | 日韩免费在线 | 亚洲综合色一区二区三区另类 | 国产精品一二三区 | 香蕉超级碰碰碰97视频在线观看 |