Django でブログ投稿機能を開発しました

更新日    投稿日 2023年08月22日
記事のサムネイル

Django で構築している当サイトにブログの投稿機能を実装しました!

ブログの投稿機能を開発しました。

当サイトはゲームやツールなどを公開してるサイトですが、1 ページ 1 ページすべて html で作成しており、簡単な開発進捗や個人的なちょっとしたことを公開することができませんでした。

そのため、管理ページから簡単なテキストを登録するだけでページを新規作成できる機能 ( ブログ機能 ) を実装しました。

早速テストもかねてのこの記事が初投稿です。

とりあえず Django でブログ機能は実装できたので、これからコメント機能や返信機能など少しずつアップグレードしていきます。

当サイトのブログ設計について

Django に blog アプリケーションを追加し、メインは以下の 2 つのモデルで管理しています。

ブログに付与するタグモデル

同じ分野のブログを紐づけ、類似した情報を探しやすくするためです。

class Tag(models.Model):
    id = models.SlugField("タグ ID", max_length=32, primary_key=True)
    name = models.CharField("タグ 名", max_length=32)
    created_at = models.DateTimeField("作成日時", auto_now_add=True, blank=True)
    updated_at = models.DateTimeField("更新日時", auto_now=True, blank=True)

    def __str__(self):
        return self.name

    class Meta():
        verbose_name = "タグ"
        verbose_name_plural = "タグ"

ブログ記事本体のモデル

ブログ自体の情報を保持します。

サムネイルは同一のものをよく使用すると思うので、アップロード毎に異なる名前を付けるのではなく、

画像のハッシュ値を画像名にすることによって同じ画像が指定された場合はアップロードせず、既存の画像を使う用にしています。

また、ユニークキーが冗長にはなりますが、SEO 対策のため URL に ID をそのまま使うようなことはせず、URL を毎回自分で命名できるようにしています。

デフォルトの整数ユニークキーを消さない理由は、文字列をインデックスにすると DB からの検索が遅くなるためです。

class Article(models.Model):
    page_name = models.SlugField("URL", max_length=32, unique=True)
    thumbnail = models.FileField("サムネイル", upload_to=thumbnail_upload_to, storage=server.OverwriteStorage, null=True, blank=True)
    title = models.CharField("タイトル", max_length=64)
    text = models.TextField("本文")
    tags = models.ManyToManyField(Tag, verbose_name="タグ", blank=True)
    is_published = models.BooleanField("公開", default=True)
    created_by = models.ForeignKey(get_user_model(), db_column="created_by", on_delete=models.SET_NULL, null=True, related_name="create_article", verbose_name="作成者")
    updated_by = models.ForeignKey(get_user_model(), db_column="updated_by", on_delete=models.SET_NULL, null=True, related_name="update_article", verbose_name="最終更新者")
    created_at = models.DateTimeField("作成日時", auto_now_add=True, blank=True)
    updated_at = models.DateTimeField("更新日時", auto_now=True, blank=True)

    def __str__(self) -> str:
        return self.title

    class Meta():
        verbose_name = "記事"
        verbose_name_plural = "記事"

最後に

あとは、view の方で Article モデルに格納された本文にいい感じのデザインを付与し、記事一覧や類似記事などもタグをもとに取得し、現在のブログページを生成しています。

また、今後 Djnago に関する記事や技術的なお話も少しづつ書いていこうと思っています。

投稿者のアイコン
  • nicoyou
  • Nicoyou Games の開発者です。
コメントを投稿するには、スパム対策のためログインが必要です
コメント
ユーザーアイコン nicoyou 2024.10.24 16:08
1 コメ