Djangoを勉強してみる_ミニSNSを作る_その2

Pocket

前回に引き続きSNSアプリを作成していきます。

SNSアプリの内容は以下の本を参考にしています。

参考

Python Django3超入門 (日本語) 単行本 – 2020/6/13 掌田 津耶乃 (著)

コードは前回の続きで作成していますので、初めから作成したい方は以下を参照してください。

Djangoを勉強してみる_ミニSNSを作る_その1

今回の目的

前回はモデルを作成しましたので、今回は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日坊主で終わってしまうという方や、ダイエットを続けたい、勉強したい、運動したいなど何か習慣化したいと思っている方がいましたら全力でサポートしますので、まずは覗いてみてください。

すでに何人かの方に実践してもらって効果が出ているという感想をいただいてます。

人生変わる?【習慣化の方法】を教えます 【残り1名】ダイエット、勉強、運動を続けることが苦手ですか?

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です