作り終わるまで連載は続く!
以前投票アプリケーションを作りました。
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で掲示板を作ってみたい⑨ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定