Djangoの「スラッグ」とは何ですか?


589

Djangoのコードを読んだとき、「スラグ」と呼ばれるものをモデルでよく見ます。これが何かはよくわかりませんが、URLと関係があることはわかっています。このナメクジをいつどのように使用する予定ですか?

(私はこの用語集でその定義を読みました。)

回答:


752

「スラッグ」は、一般にすでに取得されたデータを使用して、有効なURLを生成する方法です。たとえば、スラッグは記事のタイトルを使用してURLを生成します。手動で設定するのではなく、タイトル(または別のデータ)を指定して、関数でスラッグを生成することをお勧めします。

例:

<title> The 46 Year Old Virgin </title>
<content> A silly comedy movie </content>
<slug> the-46-year-old-virgin </slug>

ここで、次のようなDjangoモデルがあるとします。

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(max_length=1000)
    slug = models.SlugField(max_length=40)

このオブジェクトをURLと意味のある名前でどのように参照しますか?たとえばArticle.idを使用すると、URLは次のようになります。

www.example.com/article/23

または、次のようにタイトルを参照することもできます。

www.example.com/article/The 46 Year Old Virgin

スペースはURLでは無効であるため、に置き換える必要があります%20。その結果、次のようになります。

www.example.com/article/The%2046%20Year%20Old%20Virgin

どちらの試みでも、意味のある、読みやすいURLにはなりません。これの方が良い:

www.example.com/article/the-46-year-old-virgin

この例でthe-46-year-old-virginは、スラッグです。タイトルからすべての文字を小文字にして、スペースをハイフンに置き換えて作成されます-

別の例については、このWebページのURLも参照してください。


72
良い説明ですが、追加する必要があります。SlugFieldはそのままでは一意性を保証しないため、デフォルトで使用する場合は、次のURLの方が適しています。www.example.com/ article / the-40-year-old-virgin / 23 /ここで、「23」はarticle.idであり、実際にクエリを実行するために使用されます(スラッグでのクエリよりも高速です)。
Daniel Naab、2009年

126
www.example.com/article/23/the-40-year-old-virginの方が読みやすいと思います。
ミニクォーク、2009年

16
IDに基づいてコンテンツを提供する場合は、スラッグがコンテンツと一致することを確認する(一致しない場合は404を返す)か、完全に無視するかを決定します。SEOに関しては、何が最善かについての一般的なルールはないと思います。ブラウザにstackoverflow.com/questions/427102/…と入力しても、SOはこのページを表示します。
Tomas Andrle

2
@Daniel覚えておいていただきたいのは、スラッグは実際のデータベースIDも非表示にするため、この例ではスラッグを使用する利点の1つを打ち負かしています。
イーノ

15
@EnoスラッグはSEOとパーマリンクの素敵さのために追加されます。IDはインデックス付きルックアップに使用されます。stackoverflowのSEOは優れており、まさにこの戦略を使用しています。引数は「データベースIDを非表示にする」でしたが、これは「SEO」に変わっています。外出先は何ですか?
Josh Smeaton、2012年

134

私がいくつかの歴史的背景を提供するかもしれない場合:

「スラッグ」という用語は、プレスフォントが作成された金属(この場合は鉛)の鋳造に関係しています。その後、多くの印刷物がすり減ったため、すべての用紙のフォントファクトリが定期的に再溶解され、新しい型に再キャストされました。私のような見習いはそこでキャリアをスタートし、(もはやではなく)トップまで行きました。

タイポグラフは、記事の本文を、先頭の文字が賢明に積み重ねられた逆の方法で作成しなければなりませんでした。したがって、印刷時には、文字は紙の上にまっすぐになります。すべてのタイポグラフは、印刷された新聞と同じくらい速くミラーリングされた新聞を読むことができました。したがって、ナメクジ(カタツムリのような)とスローストーリー(最後に修正される)もベンチで待機していて、握りこぶしの文字だけで識別され、タイトル全体が一般的に読みやすくなっています。最後の組み立てと最終的な印刷の前に、可能性のある直前の修正(イブニングペーパー)のために、いくつかの「ホット」ニュースがベンチで待っていました。

Djangoはカンザス州のローレンスジャーナルのオフィスから現れました。おそらく一部の印刷用語はまだ残っています。A-ジャンゴマニア&フレンドリーな古いスラッグ少年フランスから。


61

「ナメクジ」という用語は、新聞制作の世界に由来します。

制作過程でストーリーに付けられる非公式の名前です。ストーリーは、ビートレポーター(これらがさらに存在すると仮定します)からエディターから「印刷機」に至るまでの経路を曲がりくねっているので、たとえば、「これらのエラーを修正しましたか?ケイト・アンド・ウィリアムの物語?」

一部のシステム(Djangoなど)では、URLの一部としてスラッグを使用してストーリーを見つけます(例:)www.mysite.com/archives/kate-and-william

Stack Overflow自体もこれを実行しますが、GEB風の(a)自己参照/programming/427102/what-is-a-slug-in-django/427201#427201を使用しますが、スラッグを置き換えることができ、blahblahそれでも問題はありません。

脚本には各シーンの開始時に「スラグライン」があり、基本的にはそのシーンの背景(場所、タイミングなど)を設定するため、それよりも前に遡ることもできます。これは、以下の説明または序文であるという点で非常に似ています。

Linotypeマシンでは、スラグは個々の文字フォームから作成された単一の金属片でした。行全体に単一のスラッグを作成することにより、これは古い文字ごとの合成で大幅に改善されました。

以下は純粋な推測ですが、スラグの初期の意味は偽造コイン(何らかの形で押されなければならない)でした。使用法が印刷用語に変換され(スラグは元の文字を使用して押される必要があったため)、そこから「金属片」の定義から「ストーリーの要約」の定義に変更されることを想像できます。そこから、それは適切な印刷からオンラインの世界への短いステップです。


(a)ダグラス・ホフスタッター 1人による「ゴーデル・エッシャー、バッハ」、私は(少なくとも)偉大な近代知的作品の1つと考えています。彼の他の作品「Metamagical Themas」もチェックしてください。


29

スラグは新聞用語です。スラグとは、文字、数字、アンダースコア、ハイフンのみを含む、何かの短いラベルです。通常、URLで使用されます。(Djangoドキュメントと同様)

Djangoのslugフィールドは、動的に作成されたWebページの有効なURLを格納および生成するために使用されます。

Stack Overflowでこの質問を追加して動的ページが生成されたのと同じように、アドレスバーに表示されるときに、スペースの代わりに「-」が付いた質問のタイトルが表示されます。それはまさしくスラグフィールドの仕事です。

ここに画像の説明を入力してください

あなたが入力したタイトルはこのようなものでした-> Djangoの「スラッグ」とは何ですか?

スラグフィールドに格納すると、「what-is-a-slug-in-django」になります(このページのURLを参照)


27

ここから。

「スラッグ」は新聞用語ですが、ここで意味するのはURLの最後の部分です。たとえば、「A bit about Django」というタイトルの投稿は自動的に「bit-about-django」になります(もちろん、自動生成されたスラッグが気に入らない場合は簡単に変更できます)。



17

Slugは、特定のコンテンツのURLフレンドリーな短いラベルです。文字、数字、アンダースコア、ハイフンのみが含まれます。スラグは通常、それぞれのコンテンツとともに保存され、URL文字列として渡されます。

SlugはSlugFieldを使用して作成できます

例:

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)

タイトルをスラッグとして使用したい場合、djangoには、 slugify

from django.template.defaultfilters import slugify

class Article(models.Model):
    title = models.CharField(max_length=100)

    def slug(self):
        return slugify(self.title)

一意性が必要な場合unique=Trueは、スラッグフィールドを追加します。

たとえば、前の例から:

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True)

あなたはスラッグプロセスをするのが面倒ですか?心配しないでください。このプラグインが役立ちます。 django-autoslug


8

また、django-adminで自動スラッグします。ModelAdminで追加:

prepopulated_fields = {'slug': ('title', )}

ここにあるように:

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug')
    search_fields = ('content', )

    prepopulated_fields = {'slug': ('title', )}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.