🌏

Python、Django でブログ実装(こつこつ①マークダウンを使えるようにする、markdownx)

に公開

今回からは、「みことプロジェクト」の記事を書く用のブログを実装していこーと思います!
前回の SNS は、長すぎたこともあってか、あまり見てもらえてないみたいなので(そもそも Django の需要の問題??)、今回からは、ある程度短めの記事で、こつこつ機能を追加していく予定です!
それでは、いきまっしょい!


どんなブログを作るのか(予定)

  • 管理画面から記事を書けるようにする
  • 記事はマークダウン形式で書き、画像も貼れるようにする
  • デザインは、ブートストラップ、CSS を積極的に使う
  • カテゴリを作る
  • ビュー・カウントを実装する
  • コメントを書けるようにする
  • データベースいじり
  • 検索実装、検索でも使えるページネーションを実装する
  • トップ・スクロールボタンを実装する(JavaScript)
  • スマホでも使える TOC 目次リンクを作る(JavaScript)

今回やること

初期設定して、管理画面からマークダウンで記事を書けるようにする


ディレクトリ構成

※変更・作成したファイルのみになります

ディレクトリ構成
blog
├ media
├ static(以下、省略)
├ templates(以下、省略)
├ blog
| ├ settings.py
| └ urls.py
└ app
  ├ admin.py
  ├ models.py
  ├ urls.py
  └ views.py


プロジェクト、アプリ作成

コマンド・プロンプト
django-admin startproject blog
cd blog
python manage.py startapp app

markdown、markdownx のスンストール

markdown: https://python-markdown.github.io/
markdownx: https://neutronx.github.io/django-markdownx/

コマンド・プロンプト
pip install markdown
pip install django-markdownx

settings.py

MEDIA_URL、MEDIA_ROOT は、markdownx での画像添付用になります。
プロジェクトの blog フォルダ内に、media フォルダ、static/app フォルダ、templates/app フォルダを作ります。

settings.py
import os
...
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_DIR = os.path.join(BASE_DIR, 'templates')  # 追加
STATIC_DIR = os.path.join(BASE_DIR, 'static')  # 追加
...
ALLOWED_HOSTS = ['localhost', '127.0.0.1']  # 開発用
...
INSTALLED_APPS = [
    ...
    'app',  # 追加
    'markdownx',  # 追加
]
...
TEMPLATES = [
        ...
        'DIRS': [TEMPLATE_DIR],
...
LANGUAGE_CODE = 'ja'  # 変更

TIME_ZONE = 'Asia/Tokyo'  # 変更
...
STATIC_URL = 'static/'
STATICFILES_DIRS = [STATIC_DIR,]  # 追加
...
MEDIA_URL = '/media/'  # 追加
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 追加

blog/urls.py

blog/urls.py
from django.conf import settings  # 追加
from django.conf.urls.static import static  # 追加
from django.contrib import admin
from django.urls import path, include  # 変更

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('app.urls')),  # 追加
    path('markdownx/', include('markdownx.urls')),  # 追加
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)  # 開発用 # 追加

app/urls.py

今回は、ビューにクラスベース・ビューを使います

app/urls.py
from django.urls import path
from . import views

app_name = 'app'

urlpatterns = [
    path('/', views.IndexView.as_view(), name='index'),
]

app/models.py

content に markdownx の MarkdownxField を使い、管理画面で記事を書いているときに、プレビューを見たり、画像をはったりできるようにします。(これは、けっこー便利です)
また、書いた markdown を html に変換するメソッドを実装します。

app/models.py
from django.db import models
import markdown
from markdownx.models import MarkdownxField

class Post(models.Model):
    title = models.CharField('タイトル', max_length=64)
    content = MarkdownxField('本文')
    created_at = models.DateTimeField('作成日', auto_now_add=True)
    page_views = models.PositiveBigIntegerField(default=0)
    
    def __str__(self):
        return self.title
    
    def markdown_to_html(self):
        md = markdown.Markdown(extensions=['extra', 'admonition', 'sane_lists', 'toc'])
        html = md.convert(self.content)
        return html

app/views.py

クラスベース・ビュー入門: https://docs.djangoproject.com/ja/5.2/topics/class-based-views/intro/
クラスベース・ビュー: https://docs.djangoproject.com/ja/5.2/topics/class-based-views/

app/views.py
from django.views import generic
from .models import Post

class IndexView(generic.ListView):
    model = Post

app/admin.py

管理画面で markdownx を使えるようにします。

app/admin.py
from django.contrib import admin
from markdownx.admin import MarkdownxModelAdmin
from .models import Post

admin.site.register(Post, MarkdownxModelAdmin)

マイグレート~スーパーユーザー作成

コマンド・プロンプト
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

動作確認

コマンド・プロンプト
python manage.py runserver 8080

http://localhost:8080/admin/にアクセス、ログインします(ダークモードです)


テスト記事を書きます。
(マークダウンの書き方は、また機会があれば、まとめようと思います)
ちゃんと、マークダウンを使え、画像やリンクもはれました。


今回のプロジェクト

GitHub: https://github.com/Animalyzm/mikoto_project
今回のプロジェクトは、django/blog です。
(Git のコミット・メッセージは django_blog_1_markdown です)
データベースなどは削除してるので、使用するにはマイグレートが必要になります。

コマンド・プロンプト
python manage.py makemigrations
python manage.py migrate

今回は以上になります、ありがとうございましたー♪

Discussion