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

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

ただいまの
回答率

90.01%

ValueError didn't return an HttpResponse object. It returned None instead.のエラー解決ができません!

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,822

morizo029

score 6

djangoの入門書から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

@login_required(login_url='/admin/login/')
def index(request):
    (public_user, public_group) = get_public()

    if request.method == 'POST':

        if request.POST['mode'] == '__check_form__':
            serchform = SearchForm()
            checkform = GroupCheckForm(request.user,request.POST)
            glist = []
            for item in request.POST.getlist('groups'):
                glist.append(item)

            messages = get_your_group_message(request.user, glist, None)

        if request.Post['mode'] == '__serch_form__':
            serchform = serchform(request.POST)
            checkform = GroupCheckForm(request.user)
            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'])
        else:
                serchform = SearchForm()
                checkform =GroupCheckForm(request.user)
                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,
                        'serch_form':serchform,
            }
        return render(request, 'sns/index.html', params)


@login_required(login_url='/admin/login')
def groups(request):
    friends = Friend.objects.filter(owner=request.user)

    if request.method == 'POST':

        if request.POST['mode'] == '__groups_form__':
            sel_group = request.POST['groups']
            gp = Group.objects.filter(owner=request.user).filter(title=sel_group).first()
            fds = Friend.objects.filter(owner=request.user).filter(group=gp)
            vlist=[]
            for item in fds:
                vlist.append(item.user.username)
            groupsform = GroupSelectForm(request.user, request.POST)
            friendsform = FriendsForm(request.user, friends=friends, vals=vlist)

        if request.POST['mode'] == 'friends_form__':
            sel_group = request.POST['group']
            group_obj = Group.objects.filter(title=sel_group).first()
            sel_fds = request.POST.getlist('friends')
            sel_users = User.objects.filter(username__in=sel_fds)
            fds = Friend.objects.filter(owner=request.user).filter(user__in=sel_users)
            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)

    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)


@login_required(login_url='/adnun/login/')
def add(request):
    add_name = request.Get['name']
    add_user = User.objects.filter(username=add_name).first()

    if add_user == request.user:
        messages.info(request, "自分自身をフレンドに追加することはできません。")
        return redirect(to='/sns')

    (public_user, public_group) = get_public()

    frd_num = Friend.objects.filter(owner=request.user).filter(user=add_user).count()

    if frd_num > 0:
        messages.info(request, add_user.usernane + ' は既に追加されています。')
        return redirect(to='/sns')

    frd = Friend()
    frd.owner = add_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):
    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):
    if request.method == 'POST':
        gr_name = request.POST['groups']
        content = request.POST['content']
        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.save()
            messages.success(request,'新しいメッセージを投稿しました!')
            return redirect(to='/sns')
        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)

    if request.method == 'POST':
        gr_name = request.POST['groups']
        content = request.POST['content']
        group = Group.objects.filter(owner=request.user).filter(title=gr_name).first()

        if group == None:
            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)

@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')


def get_your_group_message(owner, glist, find):
    (public_user,public_group) = get_public()
    group = Group.objects.filter(Q(owner=owner)|Q(owner=public_user)).filter(title__in=glist)
    me_friends = Friend.objects.filter(group__in=groups)
    me_users = []
    for f in me_friends:
        me_users.append(f.user)
    his_groups = Group.objects.filter(owner__in=me_users)
    his_friends = Friend.objects.filter(user=owner).filter(group__in=his_groups)
    me_groups = []
    for hf in his_friends:
        me_groups.append(hf.group)
    if find == None:
        messages = Message.objects.filter(Q(group__in=groups)|Q(group__un=me_groups))[:100]
    else:
        messages = Message.objects.filter(Q(group__in=groups)|Q(group__un=me_groups)).filter(content__contains=find)[:100]
        return messages

def get_public():
    public_user = User.objects.filter(username='public').first()
    public_group = Group.objects.filter(owner=public_user).first()
    return (public_user, public_group)


初心者ながらコードの掲載する際に不備などあると思いますがよろしくお願い致します。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • hayataka2049

    2019/02/11 04:30 編集

    エラーも省略せずtraceback含めて全文掲載してください

    キャンセル

  • morizo029

    2019/02/11 14:42

    Environment:
    Request Method: GET
    Request URL: http://127.0.0.1:8000/sns/
    Django Version: 2.1.5
    Python Version: 3.7.2
    Installed Applications:
    ['django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sns']
    Installed Middleware:
    ['django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware']
    Traceback:
    File "C:\Users\t0301\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py" in inner
    34. response = get_response(request)
    File "C:\Users\t0301\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response
    137. "returned None instead." % (callback.__module__, view_name)
    Exception Type: ValueError at /sns/
    Exception Value: The view sns.views.index didn't return an HttpResponse object. It returned None instead.
    すいませんtrackback載せます。
    再度申し訳ございませんがご教授お願い致します。

    キャンセル

回答 3

+1

エラーコードの詳細がないのですが、エラーメッセージを見る限り、viewの中でHttpレスポンスオブジェクトを返していないことが原因かと思います。

djangoは、必ずHttpリクエストを受け取り、Httpレスポンスを返さなければいけません。

一番簡単なのは、function based viewで
return HttpResponse('')
とする方法です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/11 14:52

    先ほど掲載したviews.py の中に
    ・from django.http import HttpResponse
    ・def my_view(request):
    return HttpResponse('')
    を追加しましたがエラーは先ほどと変わらずです。。。
    エラー詳細掲載忘れ申し訳ありませんでした。
    Environment:
    Request Method: GET
    Request URL: http://127.0.0.1:8000/sns/
    Django Version: 2.1.5
    Python Version: 3.7.2
    Installed Applications:
    ['django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sns']
    Installed Middleware:
    ['django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware']
    Traceback:
    File "C:\Users\t0301\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py" in inner
    34. response = get_response(request)
    File "C:\Users\t0301\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response
    137. "returned None instead." % (callback.__module__, view_name)
    Exception Type: ValueError at /sns/
    Exception Value: The view sns.views.index didn't return an HttpResponse object. It returned None instead.
    再度お手数ですがご教授お願い致します。

    キャンセル

0

Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/sns/

〜 省略 〜

Exception Type: ValueError at /sns/
Exception Value: The view sns.views.index didn't return an HttpResponse object. It returned None instead.

これは index関数 の中で HTTPResponseオブジェクトをreturnしてないのでエラーだよということを言っています。上記コードを見る限り index 関数は POST メソッドの時の処理しか書いていません。

def index(request):
    (public_user, public_group) = get_public()

    if request.method == 'POST':
      # 続くコードは全部このブロックの中

エラーにもあるとおり Request Method: GET でアクセスしてるので GET でアクセスした時の処理をちゃんとかけばエラーは回避されます。 もう一度本のコードと、自分のコードを見比べてみてください。インデントが違っていたりすると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

tell_kさんのとおり、エラーコードはsns.views.index、つまり、index関数がHttprequponseをreturnしていないのが原因なので、シンプルな形では
def index(request):
return HttpResponse('')
にすれば動くかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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