详解Django的 get_absolute_url() 函数:返回模型对象的 URL

  • Post category:Python

get_absolute_url() 函数是 Django 中常用的一个模型方法,该方法可以返回对象的 URL 地址。Django 中的视图函数可以直接将这个 URL 用于重定向或者构建页面。

使用 get_absolute_url() 函数,需要在模型类中定义该方法并且返回对象的 URL 地址。当在使用模型实例方法时调用该函数,它会根据模型中定义的 URL 地址模式,填充模板中的变量,并返回对象的 URL 地址。

在使用 get_absolute_url() 函数时,需要注意以下两个方面:

  1. 在定义模型类时,必须为该模型设置一个 get_absolute_url() 方法,以便能够返回对象的 URL 地址。
  2. 该方法必须返回一个 URL 地址字符串,Django 采用一个特定格式的字符串名称编写 URL 地址。

关于 URL 地址字符串的格式,Django 有以下要求:

  1. 在 URLConf 配置文件中设置的 URL 模式的名称必须为该字符串中的 viewname
  2. 所有 URL 模式的名称必须有为该字符串中的变量设置正确的值。

以下是一个使用 get_absolute_url() 函数的例子:

from django.urls import reverse
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={'pk': self.pk})

在这个例子中,我们定义了一个 Post 模型类,其中定义的 get_absolute_url() 函数将会返回这篇文章的 URL 地址。

为了使用 get_absolute_url() 函数,我们需要:

  1. Django 中的 url 函数需要在项目 URLConf 文件中定义。
  2. 将从 get_absolute_url() 函数返回的 URL 地址连接到 HTML 模板中。

在我们的项目中,get_absolute_url() 的 URL 地址为 post/(?P<pk>\d+)/。这意味着,每个 Post 实例都需要有一个唯一的整数ID,并将其作为 URL 地址中的变量值。初始化URLConf对象并分派到’post/\ /’的视图。例如,运行以下命令创建Post对象:

>>> from myapp.models import Post
>>> post = Post(title='My Title', content='Hello World!')
>>> post.save()

我们可以通过以下方式访问 get_absolute_url() 函数返回的 URL 地址:

>>> post.get_absolute_url()
'/post/1/'

我们还可以在模板中使用 get_absolute_url() 函数返回的 URL 地址,如下所示:

<a href="{{ post.get_absolute_url }}"> {{ post.title }} </a>

当我们调用 get_absolute_url() 函数时,Django 会自动将 postid 参数传递给 URLConf 视图函数。由于我们在上面定义 Post 的 URL 地址为 post/(?P<pk>\d+)/,所以 Django 将使用 pk=1 的参数值调用相应的视图函数,以便在浏览器中提供文章详细信息。

另外,我们还可以在视图函数中使用 reverse() 函数来生成一个 URL 地址字符串,正常使用的方式如下:

from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from myapp.models import Post

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    context = {
        'post': post,
    }
    return render(request, 'post_detail.html', context)

def post_redirect(request):
    post = Post.objects.latest('pk')
    url = reverse('post_detail', kwargs={'pk': post.pk})
    return redirect(url)

在上述代码中,我们以 post_redirect 为例说明如何在视图函数中使用 reverse() 函数来生成一个 URL 地址字符串。无论是在模板中使用 get_absolute_url 方法,还是在视图函数中使用 reverse() 函数,都是可以达到相同的功能的。

希望这样可以解答你的问题。