Menu
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

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

×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.