Django Slug 字段
什么是 Slug?
你是否曾经见过这样的 URL?
w3schools.com/django/learn-about-slug-field
"learn-about-slug-field" 部分就是一个 Slug。
它是一个仅包含字母、连字符、数字或下划线的描述。
它常用于 URL 中,使其更易于阅读,同时也更利于搜索引擎优化。
没有 Slug 的 URL
如果你按照本教程中的步骤创建了 Django 项目,那么你应该有一个小型 Django 项目,看起来像这样。
如果你点击第一个成员,你将跳转到此页面。
查看地址栏。
127.0.0.1:8000/members/details/1
数字“1”指的是该特定记录在数据库中的 ID。
对于开发者来说,这很有意义,但对于其他人来说可能就没有那么直观。
带有 Slug 的 URL
如果 URL 看起来像这样,那就更有意义了。
查看地址栏。
127.0.0.1:8000/members/details/emil-refsnes
这是一个更友好的 URL,Django 可以帮助你在项目中创建此类 URL。
修改 models.py 文件
首先,在数据库中添加一个新字段。
打开 models.py
文件,并添加一个名为 slug
的字段,数据类型为 SlugField
。
my_tennis_club/members/models.py
:
from django.db import models
class Member(models.Model):
firstname = models.CharField(max_length=255)
lastname = models.CharField(max_length=255)
phone = models.IntegerField(null=True)
joined_date = models.DateField(null=True)
slug = models.SlugField(default="", null=False)
def __str__(self):
return f"{self.firstname} {self.lastname}"
这是对模型结构的修改,因此我们需要进行迁移,告诉 Django 它需要更新数据库。
py manage.py makemigrations
以及迁移命令。
py manage.py migrate
更改管理界面
现在,我们在数据库中有一个新字段,但我们也希望在设置成员的姓氏或名字时自动更新该字段。
可以使用 Django 的内置功能 prepopulated_fields
来实现,你可以在其中指定要预填充的字段,以及一个包含要填充的字段的元组。
这在 admin.py
文件中完成。
my_tennis_club/members/admin.py
:
from django.contrib import admin
from .models import Member
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
list_display = ("firstname", "lastname", "joined_date",)
prepopulated_fields = {"slug": ("firstname", "lastname")}
admin.site.register(Member, MemberAdmin)
进入管理界面,打开一个记录进行编辑。
点击“保存”,"slug" 字段将自动填充姓氏和名字,由于 "slug" 字段的类型是 SlugField,它将对该值进行“slugify”,这意味着它将在每个词之间插入一个连字符。
下次你打开成员进行编辑时,你将在 slug 字段中看到这个值。
注意:由于默认情况下新字段为空,你必须对每个成员进行此保存操作。
修改模板
现在,我们可以在整个项目中用 slug 字段替换 ID 字段。
从 all_members.html
模板开始,我们在其中有一个指向详情页面的链接。
my_tennis_club/members/templates/all_members.html
:
{% extends "master.html" %}
{% block title %}
My Tennis Club - List of all members
{% endblock %}
{% block content %}
<div class="mycard">
<h1>Members</h1>
<ul>
{% for x in mymembers %}
<li onclick="window.location = 'details/{{ x.slug }}'">{{ x.firstname }} {{ x.lastname }}</li>
{% endfor %}
</ul>
</div>
{% endblock %}
修改 URL
我们还必须对 urls.py
文件进行一些更改。
从 <int:id>
更改为 <slug:slug>
。
my_tennis_club/members/urls.py
:
from django.urls import path
from . import views
urlpatterns = [
path('', views.main, name='main'),
path('members/', views.members, name='members'),
path('members/details/<slug:slug>', views.details, name='details'),
path('testing/', views.testing, name='testing'),
]
修改视图
最后,将 details
视图更改为处理传入的请求作为 slug 而不是 ID。
my_tennis_club/members/views.py
:
from django.http import HttpResponse
from django.template import loader
from .models import Member
def members(request):
mymembers = Member.objects.all().values()
template = loader.get_template('all_members.html')
context = {
'mymembers': mymembers,
}
return HttpResponse(template.render(context, request))
def details(request, slug):
mymember = Member.objects.get(slug=slug)
template = loader.get_template('details.html')
context = {
'mymember': mymember,
}
return HttpResponse(template.render(context, request))
def main(request):
template = loader.get_template('main.html')
return HttpResponse(template.render())
def testing(request):
template = loader.get_template('template.html')
context = {
'fruits': ['Apple', 'Banana', 'Cherry'],
}
return HttpResponse(template.render(context, request))
现在,链接到详情页面将使用新的 slug 化的 URL。
如果你在自己的电脑上按照所有步骤操作,你可以在自己的浏览器中看到结果:127.0.0.1:8000/members/
。
如果服务器已关闭,你需要使用 runserver
命令重新启动它。
py manage.py runserver