Django

【Djang】SlugFieldの追加とURLパスの設定方法

(最終更新月:2021年9月)

前回の記事では、日報アプリに検索機能を追加する方法を解説しました。

当記事では更なる機能を追加すべく、

  • SlugFieldを追加し、
  • 「pk」ではなく「slug」で特定のオブジェクトへアクセスする

方法について解説していきます。

スラッグでのアクセスは必要??

特定のデータへアクセスする際に今までは、

/nippo/1/

と「pk」(プライマリーキー)を使ったアクセスをしてきました。

ただ、アプリによっては自身で決めたスラッグ

/nippo/about-manage-your-staff/

とする方が便利な場合もあります。

というよりもSEO的にはスラッグによる方法が推奨されています(日報でこの機能が必要かどうかはわかりませんが、、、)

こういった「slug」を保存する時にとても便利なのが、SlugFieldです

次章にてまずはSlugFieldを追加する方法を解説します

日報アプリへSlugFieldを追加する

日報アプリへSlugFieldを追加してみましょう!

nippo > models.py

NippoModelクラスを下記のとおりとします

class NippoModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100, verbose_name="タイトル")
    content = models.TextField(max_length=1000, verbose_name="内容")
    public = models.BooleanField(default=False, verbose_name="公開する")
    slug = models.SlugField(max_length=20, blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    objects = NippoModelManager()

    def __str__(self):
        return self.title

「slug」というフィールドを追加しました

slug = models.SlugField(max_length=20, blank=True, null=True)

マイグレーションを実行します

$ python manage.py makemigrations
$ python manage.py migrate

エラーが出なければひとまずOKです!

既存データにSlugを追加

マイグレーションで問題なければ、既存のデータへslugを追加しましょう!

方法は2つ!

  1. アドミンページで一つずつ追加する方法
  2. シェルで一気に追加する方法

たくさんあって面倒だという方はシェルにて既存データを一括で書き換えましょう!

【シェルで書き換える例】※ターミナルで下記の通り進めてみよう

$ python manage.py shell
>> from nippo.models import NippoModel
>> qs = NippoModel.objects.all()
>> for index, q in enumerate(qs):
   q.slug = str(index) + “-something-you-like”
   q.save()

urls.pyの書き換え

SlugFieldの追加、既存のデータへslugが保存できましたら、URLの設定を書き換えましょう

nippo > urls.py

<int:int>でアクセスしている箇所を、<slug:slug>へ変更します

DetailViewUpdateViewDeleteViewの3つですね

urlpatterns = [
    ...,
    path("detail/<slug:slug>/", NippoDetailView.as_view(), name="nippo-detail"),
    ...,
    path("update/<slug:slug>/", NippoUpdateView.as_view(), name="nippo-update"),
    path("delete/<slug:slug>/", NippoDeleteView.as_view(), name="nippo-delete"),
]

テンプレートの書き換え

上記までで「slug」によるアクセスの設定は完了です。

直接アドレスバーに対象のURLを打ち込むと、ページが表示されるはずです。

ただこちらの変更に合わせて、ページのリンク

{% url 'nippo-update' obj.pk %}

などの表記を「slug」へ変えていく必要があります

変更すべきテンプレートは下記の通りです

  • 【nippo-list.html】obj.pkをobj.slugへ
  • 【nippo-delete.html】object.pkをobject.slugへ

以上、リンクも含めてslugによるアクセス設定は完了しました!

まとめ

当記事を通じて、SlugFieldの設定方法とアクセス設定について解説しました。

まとめると、

  1. models.pyでSlugFieldを追加
  2. 既存データへslugを追加
  3. urls.pyでslugによるアクセスへ書き換え

となります。

ただこのままですと新たに作成した日報のslugは空白となり、いちいち何かしらの値を打ち込まなければいけません。

もちろん任意な値で設定できることも必要ですが、デフォルト値を設定しておくことで手間が省けることもあるかと思います

次回は、関数を使ってSlugFieldにデフォルト値を設定する方法をお伝えします