以前の記事で、DjangoのModelのフィールドについて説明したが、今回は、DjangoのModelのFieldの一つのSlugFieldについて説明する。このSlugFieldは文字とハイフン、数字、アンダースコアだけを含んだ文字列。主にURLに利用されるフィールドである。
SlugFieldの設定と挿入のしかた
SlugFieldとは、Djangoで利用されるFieldの1つ。
以下のようなフィールド
フィールド名 | 概要 | DBでのデフォルトのカラム定義(sqlite) |
SlugField | 文字、ハイフン、アンダースコア、数字のみの文字列URLに利用される。 | varchar(50) |
- SlugField宣言時に、max_fieldを指定しない場合デフォルトで50が最大になる
- null=True, blank=Trueなどと指定しないと、デフォルトの値の入力を求められる
- デフォルトで自動的にインデックスが作成される
実際にソースコードを見てみましょう
- models.pyの定義
id = models.BigAutoField(primary_key=True)
active = models.BooleanField(blank=True)
title = models.CharField(
max_length=240, verbose_name='Post Title', unique=True, error_messages={
'unique': 'This title is not unique',
'blank': 'This is required'
},
help_text='Unique Title'
)
slug = models.SlugField(null=True, blank=True) # slugを設定
利用する場合には、以下のようにするのがよい。
urls.pyでslugの値をurlでキーと指定して、view(またはmodel)でslugをキーに値を取得する
(slugはurlに入力できる値であり、slugフィールドにはインデックスがあるため高速でレコードを取得できる)
- urls.pyの定義
path("posts/in/<slug:slug>/",views.SingleGroup.as_view(),name="single"),
]
- views.pyの定義
def get(self, request, *args, **kwargs):
group = get_object_or_404(Group,slug=self.kwargs.get("slug"))
また、slugifyに値を挿入するには、文字列をslugifyの形式に変換することが必要
そのためには、django.utils.text.slugifyを利用する
from django.utils.text import slugify
slugify('aa bb')
#aa-bb
slugify('aabb')
#aabb
slugify('Aabb')
#aabb
slugify('abcあいうえお')
# abc
slugify('abcあいうえお', allow_unicode=True)
#abcあいうえお
slugify('abc(全角スペース)あいうえお', allow_unicode=True)
#abc-あいうえお
slugify('abc葡萄', allow_unicode=True)
#abc葡萄
slugify('abc 葡萄', allow_unicode=True)
# abc-葡萄