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

Django

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

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

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

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

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

おススメ記事!興味ある方はこちらもどうぞ!

【超簡単】RaspberryPIでUbuntu搭載のPCを作る
【DigitalOcean】Dropletsを作成する5ステップ

関連書籍

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

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

/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を指定する際に、

“<slug:slug>/”….

などと最初から「slug」としてしまうと、

create/

update/

なども全てスラッグでのアクセスと認識されてしまうため、本来表示されるべき「CreateView」や「UpdateView」が正しく表示されませんのでご注意ください!

テンプレートの書き換え

上記までで「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アプリを作り、ネットで公開するまで」を解説しているサイトです。

日報アプリを一から開発し、ウェブに公開するまではこちらにまとめています

また、公開したウェブアプリはこちら(https://nippo.itc-app.site)でご覧いただけます(公開後もアップデート中)

 

その他、各分野別に

  1. Pythonについて
  2. HTML・CSSについて
  3. Djangoフレームワークについて
  4. Webサーバーについて
  5. 実際に公開をする方法

を記載したページも用意しています

 

ご自身の目的に合わせて、お好きな箇所からご覧ください

404 NOT FOUND | ITCブログ
今の自分にチャレンジする
タイトルとURLをコピーしました