电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Django的get_absolute_url方法的使用

瀏覽:84日期: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.hdgsjgj.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://www.hdgsjgj.cn/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.hdgsjgj.cn/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
相關文章:
主站蜘蛛池模板: 全国国际学校排名_国际学校招生入学及学费-学校大全网 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 除甲醛公司-甲醛检测-广西雅居环境科技有限公司 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 合肥注册公司|合肥代办营业执照、2024注册公司流程 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 云南标线|昆明划线|道路标线|交通标线-就选云南云路施工公司-云南云路科技有限公司 | 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 广州监控安装公司_远程监控_安防弱电工程_无线wifi覆盖_泉威安防科技 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 微动开关厂家-东莞市德沃电子科技有限公司| 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 北京律师咨询_知名专业北京律师事务所_免费法律咨询 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 沈阳缠绕包装机厂家直销-沈阳海鹞托盘缠绕包装机价格 | ZHZ8耐压测试仪-上海胜绪电气有限公司 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 |