Image

Djangoで自作したブログサイトに投稿機能をつけて記事を投稿できるようにしよう

Djangoで自作したブログサイトに今回は記事の投稿機能をつけてみましょう。Djangoの自作ブログの投稿機能は、models.pyとviews.pyにて関数とクラスを定義することで作ることができます。

Djangoのブログに投稿機能をつけよう

今回はDjangoでブログ記事を投稿するためにmodels.pyurls.pyコードを書いていきます



目次   

01. Djangoの投稿機能のモデルを追加

02. 投稿機能を使うためにurls.pyにコードを追加

03. Djangoのブログで使う投稿フォームを作成

04. まとめ


01. Djangoの投稿機能のモデルを追加


モデルを追加する前にやらなければならないことがあります。

まずやらなければならないこと

それはDjangoのアプリケーションフォルダを作成することです

前回作成したのはプロジェクトフォルダであって、アプリケーションフォルダではありません。

Djangoのプロジェクトフォルダはアプリの設定や時間軸などの基本的な情報のファイルをまとめるものです。

一方DjangoのアプリケーションファイルはDjangoに追加したい機能などの情報のファイルをまとめるものです。

難しそうに聞こえますが作成方法は簡単です



## manage.pyがあるファイルのディレクトリで実行
python manage.py startapp blog_app




画質が少々荒くて申し訳ありません。

この画像のようにblog_appが生成されていると思います。

まずはアプリケーションフォルダが生成されていることを確認して下さい

次にプロジェクトフォルダのsettings.pyを開いて下さい



## blog/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog_app',
]


このコードと同じになるようにDjangoのsettings.pyファイルのINSTALLED_APPSの中身にblog_appを追加して下さい


次にblog_appの中にあるmodels.pyをエディタで開いてください



## blog_app/models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# コメントモデル
class Tag(models.Model):
tag = models.CharField('タグ名', max_length=50)
def __str__(self):
return self.tag
## 投稿モデル
class Post(models.Model):
title = models.CharField('タイトル', max_length=50)
text = models.TextField('本文')
image = models.ImageField('画像', upload_to='images', blank=True)
created_at = models.DateTimeField('投稿日', default=timezone.now)
tag = models.ForeignKey(Tag, verbose_name = 'タグ', on_delete=models.PROTECT)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title


Djangoのアプリケーションフォルダのmodels.pyの中にこのコードを書いて下さい

models.pyではデータベーステーブル名などの値を設定します

Djangoではある程度枠組みが用意されています。

今回は投稿機能に必要なTag機能Post機能を追加しました

Tag機能にはmodels.CharFieldタグに名前をつけられるようにしています

ユーザーの入力によって名前を決めることができるようにしているというわけです

投稿機能にはタイトルと本文と画像、作成日時、タグ、ユーザー名を投稿するデータとして型を作っています

imageのところにあるblank=True画像がなくてもエラーが発生しないことを示しています

on_deleteはタグを削除したときにそのタグを含むPostを削除するかどうかを決めています

PROTECTは直ちに削除しないことを表しています

selfインスタンス自身を指す慣用語で

よくわからなければ基本的に引数のところに書くんだなと覚えておきましょう。


02. 投稿機能を使うためにurls.pyにコードを追加


次にDjangoのアプリケーションフォルダにurls.pyを作成しておきます

urls.pyはDjangoのプロジェクトフォルダには最初からありますが、アプリケーションフォルダには用意されていません。

そのため自分で作る必要があります。



## blog_app/urls.py
from django.urls import path
from . import views
## アプリケーション名
app_name = 'blog_app'
## URLのパターンを定義するためのもの
urlpatterns = [
]


urls.pyには上記のコードを記入しておきましょう

urls.pyではWeb上でのurlの表示を定義します

ブログテンプレートを作成したら表示のために使用します



## blog/urls.py
from django.contrib import admin
from django.urls import path, include
## URLのパターンを定義するためのもの
urlpatterns = [
path('', include('blog_app.urls')),
path('admin/', admin.site.urls),
]


blogの中にあるurls.pyに追加したblog_appのurls.pyを読み込ませておきます

こうすることでPythonファイル間の連携をすることができます


03. Djangoのブログで使う投稿フォームを作成


次にフォームを作成してユーザーからの入力を受け付けましょう

まずはDjangoのアプリケーションフォルダにforms.pyを作成して下さい



## blog_app/forms.py
from django import forms
from .models import Post, Tag, Comment
from django.forms import ModelForm
from django_summernote.widgets import SummernoteWidget

class PostAddForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'text', 'image', 'tag']
text = forms.CharField(widget = forms.Textarea)


投稿をするためのフォームはこれで完成です。

モデルはPostを参照します

フィールドはタイトル、テキスト画像、タグです

つまりユーザーはこれらのフィールドを入力することが要求されます

クラスMetaについてはselfと同じように少しわかりにくい内容ではありますが、簡単に説明するとMetaと定義することで情報を読み取って定義している親クラスにデータベースアクセスに関連する追加の情報や機能を挟んでくれます

ちょっと何言ってるかわかんないですね。

とりあえず、クラスに対して追加の情報機能を挟むためMetaクラスを使用して追加をしているといったイメージで大丈夫です


04. まとめ


お疲れ様でした。

ここまで読んでいただきありがとうございました。

今回は記事の投稿に必要なものを準備しました。