Django のスラッグ

Salman Mehmood 2023年6月20日
  1. Slug を使用して Django でユニークな投稿を取得する
  2. Django で Slug フィールドを使用する
Django のスラッグ

このデモンストレーションは、スラッグを定義し、スラッグ フィールドを使用して Python の Django で一意の投稿を取得する方法を目的としています。

Slug を使用して Django でユニークな投稿を取得する

スラッグは、実際の投稿自体でもう少し共有しやすいものになります。

たとえば、http://127.0.0.1:8000/post/pa-roate-10 をトリガーすると、このように実行できますが、これは見栄えがよくありません。 そのため、Django にスラッグの概念が導入されました。

上記の代わりに、Django Slug タイトルがあれば http://127.0.0.1:8000/post/Djangoslug のようにできます。 次に、投稿のタイトルを使用して投稿をトリガーできます。

もう 1つできることは、スペースの代わりに - を使用して、これを小文字に変換することです。 これが私たちのタイトル Django Slug で、これを - で小文字に変換すると、django-slug になります。

Django で Slug フィールドを使用する

それでは、Django で slug フィールドを使用する方法を見てみましょう。 大きい (>) 記号と小さい (<) 記号の間でスラッグを URL に渡すことができます。

特定のデータ型で指定できます。 views.categoryview()views.py ファイルから関数を呼び出し、その関数は HTML コンテンツをレンダリングします。

urlpatterns = [
    path("category/<str:cats>/", views.categoryview(), name="category"),
]

model.py ファイルにジャンプして、models.SlugField() でスラッグを呼び出しましょう。 次に、Trueunique パラメータに渡します。

これは必要項目です。 unique=True を設定したので、データベース内の一意の名前で投稿タイトルを設定します。

slug = models.SlugField(max_length=100, unique=True)

そのため、models.py ファイル内で、これが保存される前に何かを行うシグナルを作成できます。 次のコードを使用してシグナルをインポートする必要があります。

from django.db.models.signals import pre_save

タイトルをスラッグに変えるには、slugify クラスをインポートする必要があります。 したがって、タイトル Django Slugdjango-slug に変わります。

from django.template.defaultfilters import slugify

関数をシグナルレシーバーとして定義しましょう。 送信者、インスタンス、引数、およびキーワード引数を渡す必要があります。

この定義された関数では、最初にスラッグを取得し、スラッグがまだ存在しないことを確認します。 フィルターを実行して、存在するかどうかを確認します。

"%s-%s" のように文字列に等しいスラッグを書きます。 これがインスタンス ID になるので、それを呼び出すことで元のスラッグを取得できます。

def pre_save_post_reciever(sender, instance, *args, **kwargs):
    slug = slugify(instance.title)
    exists = post.objects.filter().exists()
    if exists:
        skug = "%s-%s" % (slug, instance.id)
    instance.slug = slug

    pre_save.connect(pre_save_post_reciever, sender=post)

pre_save() のメソッドが呼び出されるたびに、保存される前にこれを実行します。 pre_save_post_reciever() 関数はそれに応じてスラッグを更新します。

from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.template.defaultfilters import slugify


def pre_save_post_reciever(sender, instance, *args, **kwargs):
    slug = slugify(instance.title)
    exists = post.objects.filter().exists()
    if exists:
        skug = "%s-%s" % (slug, instance.id)
    instance.slug = slug

    pre_save.connect(pre_save_post_reciever, sender=post)
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn