Djangoで掲示板アプリを実装する

PythonのDjangoフレームワークをローカル環境にセットアップする手順

1. 仮想環境の作成: 以下のコマンドを実行して仮想環境を作成

python3 -m venv myenv

2. 仮想環境の有効化: 以下のコマンドで仮想環境を有効にする
(管理人はMacを使用)

source myenv/bin/activate

3. Djangoのインストール: 以下のコマンドでDjangoをインストールする

pip install django

4. 新しいDjangoプロジェクトの作成: 以下のコマンドを実行して新しいDjangoプロジェクトを作成する

django-admin startproject myproject
[myproject]には任意の名称を記載する

5. サーバーの起動: 以下のコマンドを実行してDjango開発サーバーを起動

cd myproject
python manage.py runserver

サーバーが起動すると、ブラウザでhttp://127.0.0.1:8000/にアクセスするとDjangoのウェルカムページが表示される。

6. アプリケーションを作成

新たなアプリケーションを作成する際には、ルートディレクトリ(manage.pyが存在するディレクトリ)で以下のコメントを実行する。

python manage.py startapp [appname]

上記コマンドにより、新しいアプリケーションディレクトリが作成され、その中には必要なファイル(models.pyなど)が自動的に生成される。

Djangoのプロジェクト構造

myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    myapp/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py
  • myprojectディレクトリ: プロジェクトのルートディレクトリで、manage.pyというPythonスクリプトを含む。manage.pyはDjangoのコマンドラインユーティリティで、python manage.py [command]の形式で使用する。
  • myappディレクトリ: アプリケーションディレクトリ。models.pyにモデルを定義。

モデル定義

簡単な掲示板アプリを実装する想定で以下の機能を実装する。

  • 投稿の表示
  • 掲示板への投稿
  • 投稿へのコメントやいいね機能

Postモデル(投稿)

  • title: タイトル(CharField)
  • content: 内容(TextField)
  • gender: 性別(CharField)
  • age: 年齢(IntegerField)
  • industry: 業界(CharField)
  • profession: 職種(CharField)
  • created_at: 作成日時(DateTimeField)
  • likes: いいねの数(IntegerField)

Commentモデル(コメント)

  • post: 関連する投稿(ForeignKey: Post)
  • name: 名前(TextField)
  • content: 内容(TextField)
  • created_at: 作成日時(DateTimeField)

上記のモデルを適用するために、models.py ファイルに下記のように記述する。

from django.db import models

class Post(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    title = models.CharField(max_length=200)
    content = models.TextField()
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
    age = models.IntegerField()
    industry = models.CharField(max_length=200)
    profession = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    likes = models.IntegerField(default=0)

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

class Like(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

変更を適用するには、マイグレーションを実行する。

python manage.py makemigrations
python manage.py migrate

ビュー実装

投稿一覧を表示するためのビューをmyapp/views.pyに作成する。

from django.shortcuts import render
from .models import Post

def index(request):
    posts = Post.objects.all()
    return render(request, 'index.html', {'posts': posts})

def create_post(request):
    return render(request, 'create_post.html')

ビュー関数内でrender関数を使うことで、テンプレートにデータを渡し、その結果をHTTPレスポンスとして返すことができる。

次に、これらのビューを使用するためにURLパターンをmyapp/urls.pyに設定。このファイルがまだ存在しない場合は新たに作成する。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('create_post', views.create_post, name='create_post'),
]

次に、投稿一覧ページと投稿作成ページのテンプレートを作成する。

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <nav>
        <a href="{% url 'create_post' %}">New Post</a>
    </nav>
    {% for post in posts %}
    <div>
        <h2>{{ post.title }}</h2>
        <p>{{ post.content }}</p>
    </div>
    {% endfor %}
</body>
</html>
<!DOCTYPE html>
<html>
<head>
    <title>Create Post</title>
</head>
<body>
    <h1>Create Post</h1>
    <!-- ここに投稿作成フォームを表示します -->
</body>
</html>

テンプレート内では{% for %}タグを使ってリストの各要素を繰り返し表示することや、{% url %}タグを使ってURLパターンの名前からURLを生成する

関連記事

コメント

この記事へのコメントはありません。