TECH I.S.

Django スラッグフィールド


スラッグとは?

次のような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ファイルを開き、データ型がSlugFieldslugというフィールドを追加します。
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

管理者の変更

これで、データベースに新しいフィールドが作成されましたが、メンバーの姓または名を設定したときに、このフィールドが自動的に更新されるようにしたいと考えています。

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 &quot;master.html&quot; %} {% 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コマンドを使用してサーバーを再起動する必要があります。

py manage.py runserver


プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細