返回顶部
首页 > 资讯 > 后端开发 > Python >Django的get_absolute_url方法的使用
  • 501
分享到

Django的get_absolute_url方法的使用

2024-04-02 19:04:59 501人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、创建模型二、设计urls三、编写视图四、html模板五、使用get_absolute_url方法六、总结思考本文主要的目的是通过一个简单的例子,展示`get_absolute

本文主要的目的是通过一个简单的例子,展示`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 admin
from app.models import Student


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


admin.site.reGISter(Student, StudentAdmin)

二、设计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比较好理解,查看所有的学生列表。但是man和woman两条路由的设计就属于特殊需求了,按理说应该直接一条路由即可,不就是查看某个具体学生的信息嘛。

但如果业务需求是这样的:男生和女生必须使用不同的url进行访问!

那就只能这么分开编写成两条路由了。

注意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>

很简单,就是展示学生的信息,没有需要关注的,仅仅用于表示运行正常,信息显示正确。

重点是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="{% 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标签的判断,决定最终生成的url是哪种。这里使用了Django内置的url模板标签语法。

访问students/页面显示结果:

点击任何一条学生链接都可以正常跳转到详情页面。

五、使用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 reverse
        if 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="{{ 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方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Django的get_absolute_url方法的使用

本文链接: https://lsjlt.com/news/132118.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Django的get_absolute_url方法的使用
    目录一、创建模型二、设计urls三、编写视图四、HTML模板五、使用get_absolute_url方法六、总结思考本文主要的目的是通过一个简单的例子,展示`get_absolute...
    99+
    2024-04-02
  • python Django模板的使用方法
    模板是一个文本,用于分离文档的表现形式和内容。 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。 模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。...
    99+
    2022-06-04
    使用方法 模板 python
  • redis中django-redis的使用方法
    本篇文章主要探讨redis中django-redis的使用方法。有一定的参考价值,有需要的朋友可以参考一下,跟随小编一起来看使用方法吧。自定义连接池这种方式跟普通py文件操作redis一样,代码如下view...
    99+
    2024-04-02
  • 在Django中使用MQTT的方法
    安装MQTT Python环境下安装MQTT也很简单,需要注意的就是不要输错命令 在Python3环境下安装Python MQTT的命令是: pip3 install pah...
    99+
    2024-04-02
  • Django 中使用日志的方法
    目录1. 日志的意义2. django 中如何处理日志3. Python 中使用日志3.1 直接输出日志信息3.2 设置日志级别3.3 保存日志到文件3.4 设置编码3.5 覆盖日志...
    99+
    2024-04-02
  • django使用crontab定时的方法
    小编给大家分享一下django使用crontab定时的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!当进行django开发时,通常会做一些特殊的定时任务,如定...
    99+
    2023-06-14
  • Django分页器的使用方法
    这篇文章主要介绍了Django分页器的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Django是一个大而全的框架。需要明确的是,传参进行分页获取分页后的数据,一般都...
    99+
    2023-06-15
  • django redis的使用方法详解
    目录1.说明2.安装3.配置3.1 配置Redis3.2 使用redis存储session3.3 redis连接超时时间设置4.使用redis4.1 使用默认redis4.2 使用指定redis(原生redis)5.连接...
    99+
    2023-04-14
    django redis使用 django redis
  • Django Admin的使用方法是什么
    本篇内容主要讲解“Django Admin的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Django Admin的使用方法是什么”吧!创建管理员用户命令行输入...
    99+
    2023-06-22
  • Django使用redis配置缓存的方法
    目录前言django应用redis缓存1.settings配置2.全站缓存3.视图函数缓存4.低级缓存5.session缓存对于非经常更新的服务器数据,若每次都从硬盘读取一次,会浪费...
    99+
    2024-04-02
  • 使用pyinstaller打包django的方法实现
    目录Step 1: 生成spec文件Step 2: 使用pyinstaller 构建可执行文件虽然django项目我们一般通过部署服务器进行发布,但是也有些情况,可能就是一个小小的数...
    99+
    2024-04-02
  • 在Django中如何使用MQTT的方法
    这篇文章主要介绍了在Django中如何使用MQTT的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。安装MQTTPython环境下安装MQTT也很简单,需要注意的就是不要输...
    99+
    2023-06-15
  • 详解Django中 render() 函数的使用方法
    render() 函数 在讲 render() 函数之前,我们在 Django 项目 index 文件夹的 urls.py 和 views.py 中编写如下功能代码:(不难,望读者细...
    99+
    2024-04-02
  • Django框架怎么使用ajax的post方法
    这篇文章主要介绍Django框架怎么使用ajax的post方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图...
    99+
    2023-06-08
  • 了解Django Shell中Python函数的使用方法
    Django是一款使用Python编写的高性能Web框架,它的一个重要特性是Django Shell,它允许我们在交互式环境下使用Python函数,这是一个非常方便的工具,让我们能够更加有效地开发和测试Django应用程序。在本文中,我们将...
    99+
    2023-09-30
    函数 django shell
  • Django中HTTP响应的使用方法是什么?
    Django是一种流行的Web框架,它提供了许多有用的功能,其中一个是HTTP响应。在本文中,我们将探讨Django中HTTP响应的使用方法。 HTTP响应是服务器向客户端发送的数据,用于响应客户端请求。在Django中,我们可以使用Htt...
    99+
    2023-07-07
    http 响应 django
  • 关于Django使用 django-celery-beat动态添加定时任务的方法
    版本信息 # 插件安装 Django==2.2.2 django-celery-beat==2.1.0 django-redis==4.8.0 mysqlclient==2.0...
    99+
    2024-04-02
  • django中使用原生sql语句的方法步骤
    raw # row方法:(掺杂着原生sql和orm来执行的操作) res = CookBook.objects.raw('select id as nid from ...
    99+
    2024-04-02
  • django channels使用、配置及实现群聊的方法
    这篇文章主要介绍“django channels使用、配置及实现群聊的方法”,在日常操作中,相信很多人在django channels使用、配置及实现群聊的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-30
  • Django基本使用方法是什么
    这篇文章主要介绍“Django基本使用方法是什么”,在日常操作中,相信很多人在Django基本使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Django基本使用方法是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作