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

  • Post category:Python

get_absolute_url()函数是Django中一个非常重要的函数,它的作用是在模型中定义一个返回对象URL的方法。这个方法可以被使用到的地方是在模板中生成一个URL或访问对象的详细信息页面等。

下面是一个get_absolute_url()函数的基本示例:

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

class MyModel(models.Model):
    # some model fields here

    def get_absolute_url(self):
        return reverse('myapp:mymodel-detail', kwargs={'pk': self.pk})

在上面的示例中,get_absolute_url()方法在根据给定的name属性和参数生成对象URL时,用到了Django自带的reverse()函数。reverse()函数接受两个参数,第一个参数是URL的name属性,第二个参数是URL中所需要的参数,例如在上例中,传入的参数是通过kwargs传递给URL的主键字段(pk)。

接下来我们来看看两个实例:

示例一

假设我们有一个名为Blog的模型,现在我们希望为每个blog生成一个对应的详细信息页面。在这个页面上,我们可以显示这篇博客的标题、文本、作者等信息。使用get_absolute_url()可以让我们生成一个URL,使我们可以在模板中链接到这个页面。

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

class Blog(models.Model):
    title = models.CharField(max_length=100)
    text = models.TextField()
    author = models.CharField(max_length=100)

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

views.py中,我们可以使用DetailView视图来渲染这个页面:

from django.views.generic.detail import DetailView
from .models import Blog

class BlogDetailView(DetailView):
    model = Blog

我们还需要在urls.py中定义URL模式:

from django.urls import path
from .views import BlogDetailView

urlpatterns = [
    path('blog/<int:pk>/', BlogDetailView.as_view(), name='blog_detail'),
]

在模板中,我们可以使用get_absolute_url()来生成链接:

{% for blog in blogs %}
    <a href="{{ blog.get_absolute_url }}">
        {{ blog.title }}
    </a>
{% endfor %}

使用这个方法,我们可以很方便地实现点击博客标题链接到详细信息页面的功能。

示例二

假设我们有一个叫做MyModel的模型,我们想要生成一个带查询字符串的URL,让用户可以根据一些条件来筛选结果。

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

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()
    active = models.BooleanField()

    def get_absolute_url(self):
        return reverse('mymodel_list') + '?name={}&age={}&active={}'.format(self.name, self.age, self.active)

views.py中,我们可以定义一个ListView视图来渲染列表:

from django.views.generic.list import ListView
from .models import MyModel

class MyModelListView(ListView):
    model = MyModel

    def get_queryset(self):
        qs = super().get_queryset()
        name = self.request.GET.get('name')
        age = self.request.GET.get('age')
        active = self.request.GET.get('active')

        if name:
            qs = qs.filter(name=name)
        if age:
            qs = qs.filter(age=age)
        if active:
            qs = qs.filter(active=active)

        return qs

我们还需要在urls.py中定义URL模式:

from django.urls import path
from .views import MyModelListView

urlpatterns = [
    path('mymodel/', MyModelListView.as_view(), name='mymodel_list'),
]

现在,在模板中我们可以使用get_absolute_url()来生成跳转链接:

<form action="{{ mymodel.get_absolute_url }}" method="get">
    <input type="text" name="name" value="{{ request.GET.name }}" placeholder="name">
    <input type="text" name="age" value="{{ request.GET.age }}" placeholder="age">
    <input type="checkbox" name="active" {% if request.GET.active %}checked{% endif %}>
    <input type="submit" value="search">
</form>

使用这个方法,我们可以很方便地实现带查询字符串的URL跳转。