ランダムおすすめ記事

ホームページ作りました

python、djangoで掲示板を作ってみたい①

作り終わるまで連載は続く!

以前投票アプリケーションを作りました。

http://160.16.55.98/polls/

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で掲示板を作ってみたい⑨ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑩ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑪ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定