スラッグとは?
次のようなURLを見たことがありますか。
w3schools.com/django/learn-about-slug-field
「スラッグフィールドについて学ぶ」部分はスラッグです。
文字、ハイフン、数字、またはアンダースコアのみを含む説明です。
URLを読みやすくするためだけでなく、検索エンジンで使いやすくするためにもよく使用されます。
スラッグなしのURL
このチュートリアルで作成したDjangoプロジェクトに従った場合は、次のような小さなDjangoプロジェクトが作成されます。
最初のメンバーをクリックすると、次のページにジャンプします。
アドレスバーを確認してください。
127.0.0.1:8000/members/details/1
数字の「1」は、データベース内の特定のレコードのIDを表します。
開発者にとっては意味のあることですが、他の人にとっては意味がありません。
スラッグ付きURL
URLが次のようになっていれば、より意味がありました。
アドレスバーを確認してください。
127.0.0.1:8000/members/details/emil-refsnes
これはよりユーザーフレンドリーなURLであり、DjangoはプロジェクトでそのようなURLを作成するのに役立ちます。
models.pyファイルを変更する
データベースに新しいフィールドを追加することから始めます。
models.py
ファイルを開き、データ型がSlugField
の slug
というフィールドを追加します。
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
移行コマンド:
管理者の変更
これで、データベースに新しいフィールドが作成されましたが、メンバーの姓または名を設定したときに、このフィールドが自動的に更新されるようにしたいと考えています。
prepopulated_fields
これは、事前に入力するフィールドと、それに入力するフィールドを含むタプルを指定する、という組み込みのDjango機能を使用して実行できます 。
これは次の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)
管理者インターフェイスに入り、編集するレコードを開きます。
「SAVE」をクリックすると、「slug」フィールドに名と姓が自動的に入力されます。「slug」フィールドはSlugField型であるため、値が「slugify」されます。つまり、各単語の間にハイフンが挿入されます。
次回編集のためにメンバーを開くと、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
受信リクエストを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))
詳細へのリンクは、新しいスラッグ化されたURLで機能するようになりました。
自分のコンピュータですべての手順を実行した場合は、自分のブラウザ127.0.0.1:8000/members/
で結果を確認できます。
サーバーがダウンしている場合は、次のrunserver
コマンドを使用してサーバーを再起動する必要があります。