python、djangoで掲示板を作ってみたい①
作り終わるまで連載は続く!
以前投票アプリケーションを作りました。
mysiteというプロジェクトにpollsというアプリケーションを配置しています。
全く新しいプロジェクトとアプリケーションを作ることも考えたのですが、それよりはmysiteに新しいアプリケーションを作ったほうが楽なようです。
同じサーバーに作ることを考えると確かに同じプロジェクトに違うアプリケーションを作ったほうが楽な気はします。
まあやってみないと分からないけど!
boardアプリケーションを作成!!!
まずはboardアプリケーションを作成。
コマンドプロンプトで
python manage.py startapp board
と打つとboardという名前のアプリケーションが作成されます。 boardのところに作りたい名前を打ち込みます。
まずは入力フォームを作ります。
urls.pyを
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.urls import path
from . import views
app_name = 'board'
urlpatterns = [
path('post', views.PostandBoard.as_view(), name='PostandBoard'),
]
最終的にフォームと掲示板のコメントは同じページに設置するつもりなんですけどそれって意外と難しい(はず)なのでまずはページを分割してみます。まずはフォームのurlを作成。
続いてviews.pyに送信フォームを作るための仕込みを。
models.pyに
from django.db import models
from django.utils import timezone
class Post(models.Model):
name = models.CharField('名前', max_length=20)
text = models.TextField('本文')
date = models.DateTimeField('日付', default=timezone.now)
このclass Postを使って簡単にフォームが作れます。 フォームの内容は名前と本文の入力。日付はユーザーではなく自動的に送信できるようにしましょう。
forms.pyのいうファイルを作成して
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('name', 'text',)
fieldsを allにしてしまうと。ユーザーが時間を入力しなくてはいけなくなるので、タプルでユーザーに入力させたいものだけを表示させます。
この部分でフォームに表示するものを決定。
fields = ('name', 'text',)
そしてviews.py
from .models import Post
from .forms import PostForm
from django.views import generic
from django.views.generic.edit import ModelFormMixin
class PostandBoard(generic.CreateView):
model = Post
form_class = PostForm
template_name = 'board/board.html'
名前をPostandBoardにしているのは最終的にこのclassだけで送信フォームと掲示板のコメントを1ページで表示させたいため。 普通はPostとかだと思います。
そしてboardディレクトリ直下にtemplatesディレクトリを作成。さらにその下に再びboardディレクトリを作成。 templatesディレクトリ直下のboardディレクトリにboard.htmlを作成。
<form action="" method="POST">
{{ form.as_p }}
<button type="submit">送信</button>
{% csrf_token %}
</form>
これで送信フォームが作成できます。 データベースにはすでにデータが送られているはずなので次はそれを表示するページを作成。 しつこいようですが最終的には1つのページに表示する予定です。 urlpatterns = [ にpathを追加。
path('', views.IndexView.as_view(), name='index'),
views.pyに
class IndexView(generic.ListView):
model = Post
と作成。 djangoはListViewを作成する場合自動的に (modelに指定した名前_list.html)というテンプレートを探してくれるらしいです。 それ以外の名前を探してほしい場合は
template_name = (探してほしい名前)
をmodel = POSTの下に追加すればよいらしいです。
とりあえず。 templatesにpost_list.htmlを作成。 内容はこう。
{% for post in post_list %}
{{ post.name }}
{{ post.text }}
{{ post.date }}
{% endfor %}
モデル名_listで自動的にmodelにあるPostの一覧を取得してくれるみたいです。これは便利だな・・・。 というわけで上に書いたコードでフォームで送信したデータの一覧が表示されるはず。
エイッ!!!!
OperationalError at /board/ no such column: board_post.name
エラーやん!!!
Djangoで、汎用ビュー(ListView, DetailView) - naritoブログ
先生のブログを見てもmodelsname_listかobject_listで取得したモデルをhtmlに反映するのは間違いないのだが・・・。
マイグレートミスってました
とここでエラーをもう一度見てみます・・・。
no such column: board_post.name
あっ!!!!!
そうだ最初間違えて
class Post(models.Model):
name = models.CharField('名前', max_length=20)
を
class Post(models.Model):
namae = models.CharField('名前', max_length=20)
で間違えて書いてマイグレーションしてたんだ!!!
んでコマンドプロンプトでマイグレートすると・・・。
C:\Users\***\Desktop\mysite>py manage.py makemigrations Did you rename post.namae to post.name (a CharField)? [y/N] y
ああーーーーーーー!!!!
ここでyを押してあとは普通に
py manage,py migrate
これでやっと投稿の一覧がエラーなく表示されました。ただしまだ送信フォームを作り切れていないので何も表示されていませんが。 では次回は実際に投稿してページにコメントが表示されるように!! がんばってみよう!
python、djangoで掲示板を作ってみたい① - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい② - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい③ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい④ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑤ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑥ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑦ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑧ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑨ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定