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

Django

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

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

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

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

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

【著者プロフィール】

profile_icon
【Python歴】11年 x 【Django歴】10年
HP作成、社内システムの構築、コンサルティング

当ブログを通じて、Webアプリの書き方やアプリの公開方法までを解説しています。

☆日報アプリ「D-Repo」(デモ版)→こちら

※Djangoをベースに作成したアプリです。

☆便利ツールアプリ「Tool Station」→こちら

※Django REST frameworkとReactで作成しているアプリです。

✔月9,800円でWebデザインが学べる

デザナルは、Webデザインに苦手意識がある方におすすめのサブスク型スクールです。

特徴は以下の通り。

  • 初期費用不要
  • 教材が使い放題
  • 案件で収入も得られる

デザナルは稼ぎながら学べる、格安のWebデザインスクールです。

>>詳細はこちら<<

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

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

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