成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Django的get_absolute_url方法的使用

瀏覽:166日期:2024-09-03 11:21:13
目錄一、創建模型二、設計urls三、編寫視圖四、HTML模板五、使用get_absolute_url方法六、總結思考

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

環境:Python3.8 + Django3.0

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

在模板中:使用url模板標簽。 在Python代碼中:使用reverse()函數。 在更高層的與處理Django模型實例相關的代碼中:使用get_absolute_url方法。

前面兩種方式比較常見,我們也很熟悉,但是最后的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

學生包含姓名、性別和電話。

不要忘記makemigrations和migrate。

然后我們接入admin后臺,隨意手動創建一些學生實例:

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方法的使用

二、設計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比較好理解,查看所有的學生列表。但是man和woman兩條路由的設計就屬于特殊需求了,按理說應該直接一條路由即可,不就是查看某個具體學生的信息嘛。

但如果業務需求是這樣的:男生和女生必須使用不同的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>

很簡單,就是展示學生的信息,沒有需要關注的,僅僅用于表示運行正常,信息顯示正確。

重點是students.html(多了個s,復數形式):

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title></head><body><h4>歡迎訪問liujiangblog.com, 學習更多Django教程</h4>{% for student in s %}{% if student.sex == ’man’ %}<p> 姓名:{{ student.name }} &nbsp;&nbsp;&nbsp;&nbsp; 詳情:<a href='http://www.piao2010.com/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://www.piao2010.com/bcjs/{% url ’woman’ student.id %}' rel='external nofollow' >{% url ’woman’ student.id %}</a></p> {% endif %} {% endfor %}</body></html>

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

訪問students/頁面顯示結果:

Django的get_absolute_url方法的使用

點擊任何一條學生鏈接都可以正常跳轉到詳情頁面。

五、使用get_absolute_url方法

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

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

實際上我們可以使用get_absolute_url方法,在Python代碼中實現這一功能。

首先,修改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方法中,我們導入了reverse,這是Django提供的反向解析功能。

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

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

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

<body><h4>歡迎訪問liujiangblog.com, 學習更多Django教程</h4>{% for student in s %} <p>姓名:{{ student.name }} &nbsp;&nbsp;&nbsp;&nbsp;詳情:<a href='http://www.piao2010.com/bcjs/{{ student.get_absolute_url }}' rel='external nofollow' >{{ student.get_absolute_url }}</a> </p>{% endfor %}</body>

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

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

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

六、總結思考

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

Django本身沒有實現一個基本的get_absolute_url方法,在models.Model中也沒有get_absolute_url方法的影子,所以這個方法其實只是個思路,沒有實質。

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

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

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

標簽: Django
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美日韩二区三区| 欧美性大战久久| 色噜噜狠狠成人网p站| 国产午夜一区二区三区| 国产 日韩 欧美大片| 色88888久久久久久影院按摩 | 午夜亚洲福利在线老司机| 中文字幕乱码一区二区免费| 国产成人激情av| 欧美一区日本一区韩国一区| 久久97超碰国产精品超碰| 一本久久a久久免费精品不卡| 亚洲成人动漫在线观看| 国产午夜精品一区二区三区欧美| 亚洲人成在线观看一区二区| 激情av一区| 国产精品青草综合久久久久99| 99精品国产99久久久久久白柏| 精品日韩一区二区| 成人av网站免费观看| 精品少妇一区二区三区日产乱码| 成人午夜视频在线观看| 精品国产伦一区二区三区观看体验| 国产成人在线免费观看| 欧美va在线播放| 99这里都是精品| 久久亚区不卡日本| 91免费视频网| 国产精品免费网站在线观看| 欧美天天视频| 中文字幕综合网| 亚洲激情女人| 樱花草国产18久久久久| 亚洲欧美日韩精品在线| 午夜激情久久久| 欧美亚洲一区二区三区四区| 久久 天天综合| 日韩欧美的一区二区| 成人国产精品免费网站| 久久久不卡网国产精品二区| 国产精品v亚洲精品v日韩精品| 国产精品久久久久永久免费观看| 欧美午夜不卡| 亚洲精品成人少妇| 久久精品亚洲| 麻豆精品视频在线| 欧美一级免费观看| 欧美一区国产在线| 一区二区三区四区视频精品免费| 久久午夜电影| 国产二区国产一区在线观看| 精品国产麻豆免费人成网站| 好看的日韩av电影| 亚洲国产精品久久不卡毛片| 欧美做爰猛烈大尺度电影无法无天| 国内久久精品视频| 欧美大片一区二区三区| 午夜久久黄色| 一区二区三区美女| 欧美偷拍一区二区| 成人av资源站| 国产精品高潮呻吟| 久久精品中文| 国产精品一区二区久激情瑜伽| 精品美女被调教视频大全网站| 精品不卡视频| 久久99久久久久| 久久久91精品国产一区二区精品| 国产精品久久久免费| 国产一区二区三区四区在线观看| 国产亚洲一区二区在线观看| 亚洲毛片播放| 国内一区二区在线| 国产欧美日韩精品在线| 国产麻豆综合| 国产精品一区2区| 中文字幕欧美区| 亚洲一区日韩在线| 成人网在线播放| 亚洲人妖av一区二区| 在线视频国内一区二区| av在线不卡电影| 亚洲夂夂婷婷色拍ww47| 欧美另类变人与禽xxxxx| 亚洲欧美亚洲| 日韩精品一级中文字幕精品视频免费观看 | 国产精品久99| 日本精品裸体写真集在线观看| 成人99免费视频| 亚洲精品久久久蜜桃| 91精品国产综合久久福利| 黄色亚洲大片免费在线观看| 美国一区二区三区在线播放| 久久精品视频一区| 蜜桃久久精品乱码一区二区| av亚洲精华国产精华| 午夜久久久久久电影| 久久精品一区二区| 久久亚洲欧洲| 欧美a级片一区| 人人精品人人爱| 国产精品色一区二区三区| 欧美亚洲一区三区| 国产综合欧美| 国产很黄免费观看久久| 亚洲精品综合在线| 欧美一区二区三区喷汁尤物| 国产视频在线观看一区| av在线不卡免费看| 免费在线观看一区二区三区| 亚洲国产精品v| 欧美日韩亚洲高清一区二区| 在线精品一区| 国产一区二区三区四区在线观看| 亚洲视频每日更新| 欧美日韩高清一区二区不卡| 亚洲免费高清| 高清日韩电视剧大全免费| 亚洲精品国产精华液| 久久综合成人精品亚洲另类欧美| 久久青草久久| 亚洲国产午夜| 不卡的av在线| 久久成人免费网站| 亚洲综合一区二区精品导航| 久久先锋影音av| 欧美日韩一区二区三区四区 | 日韩三级.com| 久久一区二区三区四区五区 | 国产伦精品一区二区三区免费迷 | 在线看日韩精品电影| 精品91久久久久| 国产精品一级片在线观看| 亚洲一二三专区| 欧美激情综合五月色丁香| 欧美一区在线视频| 91传媒视频在线播放| 亚洲伦伦在线| 欧美aa国产视频| 粉嫩av一区二区三区在线播放| 亚洲电影视频在线| 中文字幕一区二| 26uuu成人网一区二区三区| 欧洲一区二区三区在线| 国产精品手机视频| 91麻豆精品视频| 国产成人午夜精品5599 | 97se亚洲国产综合自在线不卡| 另类综合日韩欧美亚洲| 亚洲国产乱码最新视频| 亚洲精品中文字幕在线观看| 久久夜色精品国产欧美乱极品| 欧美精品丝袜久久久中文字幕| 色综合激情五月| 性欧美长视频| 日韩天堂av| 伊人成人在线视频| 欧美日韩三区四区| 99久久精品情趣| 成人av高清在线| 成人免费观看av| 久久精品国产秦先生| 午夜影视日本亚洲欧洲精品| 中文字幕一区二区三| 国产亚洲综合在线| 精品噜噜噜噜久久久久久久久试看 | 欧美黄色精品| bt欧美亚洲午夜电影天堂| 国产精品一卡二卡在线观看| 久久精品国产99国产| 亚洲v中文字幕| 亚洲自拍与偷拍| 亚洲激情中文1区| 亚洲人成网站在线| 亚洲精品伦理在线| 国产精品乱码人人做人人爱 | 国产人妖乱国产精品人妖| 精品国产一区二区在线观看| 91精品国产综合久久精品麻豆| 欧美亚洲免费在线一区| 色婷婷一区二区三区四区| 久久久久久久久久久久久9999| 羞羞答答国产精品www一本| 国产精品亚洲综合久久| 国产一区二区三区成人欧美日韩在线观看| 午夜精品婷婷| 影音欧美亚洲| 99精品国产99久久久久久福利| 国产欧美一级| 久久精品官网| 色成人在线视频| 欧美一a一片一级一片| 欧美精品乱人伦久久久久久| 67194成人在线观看| 日韩西西人体444www| 精品少妇一区二区三区视频免付费| 欧美成人欧美edvon| 精品国产乱子伦一区| 久久久www成人免费无遮挡大片| 欧美激情一区二区三区不卡 |