前回に引き続きSNSアプリを作成していきます。
SNSアプリの内容は以下の本を参考にしています。
参考
Python Django3超入門 (日本語) 単行本 – 2020/6/13 掌田 津耶乃 (著)
コードは前回の続きで作成していますので、初めから作成したい方は以下を参照してください。
今回の目的
前回はモデルを作成しましたので、今回はSNSアプリのフォームを準備します。
フォームの準備をする
forms.pyのファイルを新規作成してコードを書いていきます。
1.forms.pyを新規作成
ファイル:sample_app>sns>forms.py
コード:
from django import forms from.models import Message,Group,Friend,Good from django.contrib.auth.models import User #Messageのフォーム(未使用) class MessageForm(forms.ModelForm): class Meta: model = Message fields = ['owner', 'group', 'content'] #Groupのフォーム(未使用) class GroupForm(forms.ModelForm): class Meta: model = Group fields = ['owner', 'title'] #Friendのフォーム(未使用) class FriedForm(forms.ModelForm): class Meta: model = Friend fields = ['owner', 'user', 'group'] #Goodのフォーム(未使用) class GoodForm(forms.ModelForm): class Meta: model = Good fields = ['owner', 'message'] #Groupのチェックボックスフォーム class GroupCheckForm(forms.Form): def __init__(self, user, *args, **kwargs): super(GroupCheckForm, self).__init__(*args, **kwargs) public = User.objects.filter(username='public').first() self.fields['groups'] = forms.MultipleChoiceField(choices=[(item.title, item.title) for item in Group.objects.filter(owner__in=[user,public])], widget=forms.CheckboxSelectMultiple(),) #Groupの選択メニューフォーム class GroupSelectForm(forms.Form): def __init__(self, user, *args, **kwargs): super(GroupSelectForm, self).__init__(*args, **kwargs) self.fields['groups'] = forms.ChoiceField(choices=[('-','-')] + [(item.title, item.title) for item in Group.objects.filter(owner == user)], widget=forms.Select(attrs={'class':'form-control'}),) #Friendのチェックボックスフォーム class FriendsForm(forms.Form): def __init__(self, user, friend = [], vals = [], *args, **kwargs): super(FriendsForm, self).__init__(*args, ** kwargs) self.fields['friends'] = forms.MultipleChoiceField(choices=[(item.user, item.user) for item in friends], widget=forms.CheckboxSelectMultiple(), initial=vals) #Group作成フォーム class CreateGroupForm(forms.Form): group_name = forms.CharField(max_length=50,\ widget=forms.TextInput(attrs={'class':'form-control'})) #投稿フォーム class PostForm(forms.Form): content = forms.CharField(max_length=500,\ widget=forms.Textarea(attrs={'class' :'form-control', 'rows':2})) def __init__(self, user, *args, **kwargs): super(PostForm, self).__init__(*args, **kwargs) public = User.objects.filter(username='public').first() self.fields['groups'] = forms.ChoiceField(choices=[('-','-')] + [(item.title, item.title) for item in Group.objects.filter(owner__in=[user,public])], widget=forms.Select(attrs={'class':'form-control'}))
Groupのチェックボックスフォームについて解説します。
まず「def __init__(self, user, *args, **kwargs):」ですが、initというのはインスタンスを作成するときに呼び出される初期化メソッドです。
今回は、selfのあとにuserという引数を準備しています。この引数はGroupを取得するUserを引数として渡すためのものです。
次に「super(GroupCheckForm, self).__init__(*args, **kwargs)」です。ここではsuperというメソッドを使います。
superとは、親クラスのメソッドを子クラスでも利用ようになります。
「public = User.objects.filter(username=’public’).first()」は、public変数にusernameがpublicのものを検索し一番最初のものをfirstで取り出しています。
「self.fields[‘group’] = forms.MultipleChoiceField(choices=[(item.title, item.title) for item in Group.objects.filter(owner__in=[user,public])],
widget=forms.CheckboxSelectMultiple(),)」ですが、まず変数としてself.fields[‘group’]でgroupという新規のフィールドを準備しています。
そして、フォームに複数選択可能なMultipleChoiceFieldを準備してchoicesで選択する項目を準備します。
choicesの中身は繰り返し分のfor文を使って、ownerがuserかpublicのgroupを検索して、検索した項目を選択項目としています。
その他のクラスも同じような考え方で作成しています。
続いて、urlを書いていきます。
2.urls.pyを新規作成
ファイル:sample_app>sns>urls.py
コード:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('<int:page>', views.index, name='index'), path('groups', views.groups, name='groups'), path('add', views.add, name='add'), path('creategroup', views.creategroup, name='creategroup'), path('post', views.post, name='post'), path('share/<int:share_id>', views.share, name='share'), path('good/<int:good_id'>, views.good, name='good'), ]
続いてプロジェクト側のurls.pyを編集します。
3.プロジェクトのurls.pyを編集
ファイル:sample_app>sample_app>urls.py
コード:
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('hello/', include('hello.urls')), path('sns/', include('sns.urls')), #追加 ]
snsの部分を追加しました。
今回は長いのでここまでとします。
次回はメインとなるviews.pyを作成していきます。
以上です。ありがとうございました。
P.S.
勉強を継続することが苦手ですか?
少し前からココナラというサービスで習慣化のテクニックについて教えるサービスを始めました。
もし、いつも3日坊主で終わってしまうという方や、ダイエットを続けたい、勉強したい、運動したいなど何か習慣化したいと思っている方がいましたら全力でサポートしますので、まずは覗いてみてください。
すでに何人かの方に実践してもらって効果が出ているという感想をいただいてます。
コメント