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

※本サイトにはプロモーション・広告が含まれています。

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

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

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

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

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

✔YouTube解説動画

当記事の内容は動画を見ながら進めると、約15分程度で完了します。

動画ならではの情報も解説しているので、記事と一緒にご覧ください。

動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

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

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

/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にデフォルト値を設定する方法をお伝えします

タイトルとURLをコピーしました