Djangoで写真投稿SNSを作成しよう-ストーリー対話形式で学ぶ③ 写真投稿機能
以下のnoteの続きになります。
コードをPushしたGitリポジトリはこちら。
登場人物
新卒エンジニア:さくら
IT企業に新卒で入社したばかりの元気な女の子。プログラミングは学校で学んだ程度だが、熱意と好奇心は人一倍。
エンジニア:たけし
さくらの教育係。優しく教えるのが得意で、さくらの成長を見守る頼れる先輩。
写真投稿機能の実装
写真投稿機能の概要
たけし: 「今日は写真投稿機能を実装するよ。SNSの中心的な機能だから、ここをしっかり作り込むことが重要だね。」
さくら: 「写真投稿って、ユーザーが画像をアップロードして、他のユーザーとシェアする機能ですよね?」
たけし: 「そうだよ。ユーザーが写真をアップロードして、キャプションをつけたり、タグを追加したりできるようにする。これによってユーザー同士の交流が生まれるんだ。」
さくら: 「なるほど。SNSの中でも特に重要な部分ですね。どうやって実装するんですか?」
たけし: 「まずは、写真をアップロードするためのモデルを作成して、その後にビューとテンプレートを作っていこう。」
モデルの確認
たけし: 「まずは、既に作成済みのPostモデルを確認するよ。このモデルには、写真のファイル、キャプション、投稿者、投稿日時、そしてタグを含めていたはずだよね。」
posts/models.py
# posts/models.py
...
class Post(models.Model):
image = models.ImageField(upload_to='images/')
caption = models.TextField(max_length=500, blank=True)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
tags = models.CharField(max_length=100, blank=True)
def __str__(self):
return f'{self.author.username} - {self.caption[:20]}'
...
さくら: 「このモデルで、投稿に関するデータをすべて管理するんですね。」
たけし: 「そうだよ。次は、このモデルを使って写真をアップロードするためのフォームを作成しよう。」
フォームの作成
たけし: 「フォームは、ModelFormを使うことで簡単に作成できる。Postモデルに基づいて、写真とキャプションを入力するためのフォームを作成するよ。」
# posts/forms.py
from django import forms
from allauth.account.forms import SignupForm
from .models import Interest, Post
class CustomSignupForm(SignupForm):
#interests = forms.ModelMultipleChoiceField(queryset=Interest.objects.all(), widget=forms.CheckboxSelectMultiple)
def save(self, request):
user = super(CustomSignupForm, self).save(request)
#user.interests.set(self.cleaned_data['interests'])
user.save()
return user
#これを追加
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['image', 'caption', 'tags']
さくら: 「フォームを作るのも思ったより簡単ですね。ModelFormを使うと、自動でモデルのフィールドに対応したフォームができるんですね。」
たけし: 「その通り。次は、ビューを作成して、フォームをユーザーに表示できるようにしよう。」
ビューの作成
たけし: 「写真を投稿するためのビューを作成するよ。このビューでは、ユーザーが写真とキャプションを入力し、投稿できるようにするんだ。」
# posts/views.py
from django.shortcuts import render, redirect
from .forms import PostForm
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
return redirect('home')
else:
form = PostForm()
return render(request, 'create_post.html', {'form': form})
さくら: 「ビューの中で、フォームのデータを受け取って、それを保存するんですね。」
たけし: 「そうだよ。request.FILESを使って、画像ファイルも一緒に送信できるようにしている。これでユーザーは写真を投稿できるようになるよ。」
テンプレートの作成
たけし: 「次は、写真投稿画面のテンプレートを作成しよう。ユーザーが写真とキャプションを入力する画面だね。」
<!-- templates/create_post.html -->
{% extends 'base_generic.html' %}
{% block content %}
<h2>Create a New Post</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Post</button>
</form>
{% endblock %}
さくら: 「このテンプレートで、ユーザーが写真を選んでキャプションを入力できるんですね。」
たけし: 「そうだね。これで写真投稿機能の実装はほぼ完了だ。次は、この機能がちゃんと動くか確認しよう。」
管理画面にログイン
たけし: 「Djangoにはデータベースのレコードを管理できる管理者用の機能がデフォルトで用意されているよ。まずpostsフォルダの中のadmin.pyを以下のように修正しよう」
from django.contrib import admin
from .models import Post, CustomUser, Interest, Tag
admin.site.register(Post)
admin.site.register(CustomUser)
admin.site.register(Interest)
admin.site.register(Tag)
さくら: 「管理したいmodelをここに登録するんですね」
たけし: 「そうだね。保存できたらmanage.pyのあるディレクトリで次のコマンドを入力する。管理者アカウントが作成されるよ」
python manage.py createsuperuser
さくら: 「ユーザー名とかメールアドレスとかパスワードをここで入力するんですね」
たけし: 「そうそう。適当なもので良いので入力しよう。パスワードはここでは1234など短いもので良いんだけど、下のようにパスワードが短いけど大丈夫かい? と確認されるから"y"(yes)を打ってね」
さくら: 「できましたっ!」
たけし: 「できたらいつものようにrunserverコマンドを実行して、今度はhttp://127.0.0.1:8000/adminにアクセスしよう」
python manage.py runserver
たけし: 「登録したユーザー名やパスワードを入れてログインしてね。データベースの内容が確認できる管理画面が開くよ」
さくら: 「昨日作ったアカウントがちゃんとありますね」
たけし: 「よく気付いたね。Usersテーブルで確認できるはずだ。あとで写真を投稿したときはPostsテーブルで確認するよ。その前にここではTagsテーブルを選択しよう」
たけし: 「右上の"ADD TAG"を選択して投稿用に使えるタグを登録しておくよ。とりあえずCatと入力して登録しておこう」
さくら: 「わかりました!」
動作確認とディスカッション
二人はブラウザを開き、写真投稿機能の動作確認を行った。
さくら: 「投稿画面にアクセスできました!実際に写真を投稿してみますね。」
さくらは猫の写真をアップロードし、キャプションを入力して投稿ボタンをクリックした。
さくら: 「投稿できました!管理画面にもちゃんと表示されてますね。」
たけし: 「いい感じだね。これでユーザーが写真を投稿できるようになった。次は、他のユーザーがこの写真を見られるようにする機能を追加していこう。」
さくら: 「そうですね。これからがますます楽しみです!」
たけし: 「写真投稿機能はSNSの中心的な部分だから、これを基にさらに機能を拡張していくよ。」
こうして、たけしとさくらは写真投稿機能の実装を無事に終え、次なるステップに進む準備が整った。さくらの成長と共に、プロジェクトも着実に進んでいく。
次回へ続く。
スキや感想をnote・Xでお待ちしてます!
サポートは料理好きなのでの食材費にさせていただきます。