質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

Python Django 超入門 のサンプルが動きません(ミニSNS)

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 65

omocchi

score 5

python jango 超入門 という参考書にあるミニSNSを作っているのですが、このエラーが出てきてしまい、調べても解決できません。
イメージ説明

from django.shortcuts import render
from django.shortcuts import redirect
from django.contrib.auth.models import User
from django.contrib import messages

from .models import Message,Friend,Group,Good
from .forms import GroupCheckForm,GroupSelectForm, \
        SearchForm,FriendsForm,CreateGroupForm,PostForm

from django.db.models import Q
from django.contrib.auth.decorators import login_required

#indexのビュー関数 
@login_required(login_url='/admin/login/')
def index(request):
    #publicのuserを取得
    (public_user, public_group) = get_public()

    #POST送信時の処理
    if request.method == 'POST':

        #Groupのチェックを更新した時の処理
        if request.POST['mode'] == '__check_form__':
            #フォームの用意
            searchform = SearchForm()
            checkform = GroupCheckForm(request.user, request.POST)
            #チェックされたGroup名をリストにする
            glist = []
            for item in request.POST.getlist('groups'):
                glist.append(item)
            #Messageの取得
            messages = get_your_group_message(request.user, \
                                              glist, None)

        if request.POST['mode'] == '__search_form__':
            #フォームの用意
            searchform = SearchForm(request.POST)
            checkform = GroupCheckForm(request.user)
            #Groupのリストを取得
            gps = Group.objects.filter(owner=request.user)
            glist = [public_group]
            for item in gps:
                glist.append(item)
            #メッセージ取得
            messages = get_your_group_message(request.user, glist, \
                                              request.POST['search'])
        #GETアクセス時の処理
        else:
            #フォームの用意
            searchform = SearchForm()
            checkform = GroupCheckForm(request.user)
            #Groupのリストを取得
            gps = Group.objects.filter(owner=request.user)
            glist = [public_group]
            for item in gps:
                glist.append(item)
            #メッセージの取得
            messages = get_your_group_message(request.user, glist, None)

        #共通処理
        params = {
                'login_user':request.user,
                'contents':messages,
                'check_form':checkform,
                'search_form':searchform,
                }
        return render(request, 'sns/index.html',params)

@login_required(login_url='/admin/login/')
def groups(request):
    #自分が登録したFriendを取得
    friends = Friend.objects.filter(owner=request.user)

    #POST送信時の処理
    if request.method == 'POST':

        #Groupメニュー選択肢の処理
        if request.POST['mode'] == '__groups_form__':
            #選択したGroupを取得
            sel_group = request.POST['groups']
            #Group取得
            gp = Group.objects.filter(owner=request.user) \
                .filter(title=sel_group).first()
            #Groupに含まれるFriendを取得
            fds = Friend.objects.filter(owner=request.user) \
                .filter(group=gp)
            #FriendのUserをリストにまとめる
            vlist = []
            for item in fds:
                vlist.append(item.user.username)
            #フォームの用意
            groupsform = GroupSelectForm(request.user,request.POST)
            friendsform = FriendsForm(request.user, \
                                      friends=friends, vals=vlist)
        #Friendsのチェック更新時の処理
        if request.POST['mode'] == '__friends_form__':
            #選択したGroupの取得
            sel_group = request.POST['group']
            group_obj = Group.objects.filter(title=sel_group).first()
            #チェックしたFrindsを取得
            sel_fds = request.POST.getlist('friends')
            #FriendsのUserを取得
            sel_users = User.objects.filter(username__in=sel_fds)
            #Userのリストに含まれるユーザーが登録したFriendsを取得
            fds = Friend.objects.filter(owner=request.user) \
                .filter(user__in=sel_users)
            #すべてのFriendにGroupを設定し保存する
            vlist = []
            for item in fds:
                item.group = group_obj
                item.save()
                vlist.append(item.user.username)
            #メッセージを設定
            messages.success(request,'チェックされたFriendを' + \
                             sel_group + 'に登録しました。')
            #フォームの用意
            groupsform = GroupSelectForm(request.user, \
                                         {'groups':sel_group})
            friendsform = FriendsForm(request.user, \
                                      friends=friends, vals=vlist)
                    #GETアクセス時の処理
    else:
        #フォームの用意
        groupsform = GroupSelectForm(request.user)
        friendsform = FriendsForm(request.user, friends=friends, \
                                  vals=[])
        sel_group = '-'

    #共通処理
    createform = CreateGroupForm()
    params = {
            'login_user':request.user,
            'groups_form':groupsform,
            'friends_form':friendsform,
            'create_form':createform,
            'group':sel_group,
            }
    return render(request, 'sns/groups.html', params)

#Friendの追加処理
@login_required(login_url='/admin/login/')
def add(request):
    #追加するUser取得
    add_name = request.GET['name']
    add_user = User.objects.filter(username=add_name).first()
    #Userが本人の場合の処理
    if add_user == request.user:
        messages.info(request, "自分自身をFriendにすることは\
                      できません。")
        return redirect(to='/sns')
    #publicの取得
    (public_user, public_group) = get_public()
    #add_userのFriendの数を調べる
    frd_num = Friend.objects.filter(owner=request.user) \
            .filter(user=add_user).count()
    #0より大きければすでに登録済み
    if frd_num > 0:
        messages.info(request, add_user.username + \
                      'は既に追加されています。')
        return redirect(to='/sns')

    #friend登録処理
    frd = Friend()
    frd.owner = request.user
    frd.user = add_user
    frd.group = public_group
    frd.save()
    #メッセージを設定
    messages.success(request, add_user.username + 'を追加しました! \
                     groupページに移動して、追加したFriendをメンバーに設定してください')
    return redirect(to='/sns')

#グループの作成処理
@login_required(login_url='/admin/login/')
def creategroup(request):
    #Groupを作り、Userとtitleを設定して保存する
    gp = Group()
    gp.owner = request.user
    gp.title = request.POST['group_name']
    gp.save()
    messages.info(request,'新しいグループを作成しました。')
    return redirect(to='/sns/groups')

#メッセージのポスト処理
@login_required(login_url='/admin/login/')
def post(request):
    #POST送信の処理
    if request.method == 'POST':
        #送信内容の取得
        gr_name = request.POST['groups']
        content = request.POST['content']
        #Groupの取得
        group = Group.objects.filter(owner=request.user)\
                .filter(title=gr_name).first()
        if group == None:
            (pub_user, group) = get_public()
        #Messageを作成し設定して保存
        msg = Message()
        msg.owner = request.user
        msg.group = group
        msg.content = content
        msg.save()
        #メッセージを取得
        messages.success(request,'新しいメッセージを投稿しました。')
        return redirect(to='/sns')

    #GETアクセス時の処理
    else:
        form = PostForm(request.user)

    params = {
            'login_user':request.user,
            'form':form,
            }
    return render(request, 'sns/post.html', params)

#投稿をシェアする
@login_required(login_url='/admin/login/')
def share(request, share_id):
    #シェアするメッセージの取得
    share = Message.objects.get(id=share_id)

    #POST送信時の処理
    if request.method == 'POST':
        #送信内容を取得
        gr_name = request.POST['groups']
        content = request.POST['content']
        #Groupの取得
        group = Group.objects.filter(owner=request.user) \
                .filter(title=gr_name).first()

        if group == None:
            (pub_user, group) = get_public()
        #メッセージを作成し、設定して保存
        msg  = Message()
        msg.owner = request.user
        msg.group = group
        msg.content = content
        msg.share_id = share.id
        msg.save()
        share_msg = msg.get_share()
        share_msg.share_count += 1
        share_msg.save()
        #メッセージを設定
        messages.success(request,'メッセージをシェアしました')
        return redirect(to='/sns')

    #共通処理
    form = PostForm(request.user)
    params = {
            'login_user':request.user,
            'form':form,
            'share':share,
            }
    return render(request, 'sns/share.html',params)

#Goodボタンの処理
@login_required(login_url='/admin/login/')
def good(request, good_id):
    good_msg = Message.objects.get(id=good_id)
    is_good = Good.objects.filter(owner=request.user)\
            .filter(message=good_msg).count()

    if is_good > 0:
        messages.success(request, '既にメッセージをGoodしています。')
        return redirect(to='/sns')

    good_msg.good_count += 1
    good_msg.save()
    good = Good()
    good.owner = request.user
    good.message = good_msg
    good.save()

    messages.success(request,'メッセージをGoodしました!')
    return redirect(to='/sns')
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tatamyiwathy

    2019/12/03 14:12

    views.pyはどのようになっているでしょうか?

    キャンセル

  • hayataka2049

    2019/12/03 14:19

    過去質問はリンクで示してください。
    (できればマークダウンで、難しいのであればURLをそのまま書いても構いませんが、スクショはさすがに困ります)

    キャンセル

  • omocchi

    2019/12/03 22:26

    すみません。。
    今確認したらその過去質問はhayataka2049様の解答のものでした!
    https://teratail.com/questions/173758

    キャンセル

  • omocchi

    2019/12/03 22:38

    views.pyをのせようとしたら文字数制限で出来ませんでした。
    出来る範囲だけでのせてもよろしいでしょうか。。
    お手数おかけして申し訳ありません。

    キャンセル

回答 1

0

おそらくですけど

  if request.method == 'POST':


でHttpResponseをreturnで返してますけどGETのときに返していないところがあるので、そこが原因だとおもいます。

  if request.method == 'POST':
    return HttpResopnse
  return HttpResponse # <- これが無い

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる