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跳转。