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 フォルダを作ります。
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
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
今回は、ビューにクラスベース・ビューを使います
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 に変換するメソッドを実装します。
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/
from django.views import generic
from .models import Post
class IndexView(generic.ListView):
model = Post
app/admin.py
管理画面で markdownx を使えるようにします。
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