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

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

ただいまの
回答率

88.21%

Django administrationでnot definedエラーが出てしまいます。

解決済

回答 1

投稿

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

beginner-m

score 11

プログラミング初心者です。
Python Django 超入門という参考書を読みながら学習をしているのですが、
サーバーにname 'public_user' is not definedというエラーで躓いてしまっております。

発生している問題・エラーメッセージ

name 'public_user' is not defined

該当のソースコード

【views.py】

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__':
            searchform = 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'] == '__search_form__':
            searchform = SearchForm(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:
        searchform = 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,
            'search_form':searchform,
        }
    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='/admin/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, "自分自身をFriendにすることはできません。")
        return redirect(to='/sns')

    (public_user,public_group) = get_public()
    #add_userのFriendの数を調べる
    frd_num = Friend.objects.filter(owner=request.user).filter(user=add_user).count()
    if frd_num > 0:
        messages.info(request, add_user.username + 'は既に追加されています。')
        return redirect(to='/sns')

    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):
    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:
            (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.usre,
            '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_usre,public_group) = get_public()
    groups = 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__in=me_groups))[:100]
    else:
        messages = Message.objects.filter(Q(group__in=groups)|Q(group__in=me_groups)).filte(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)

補足情報(FW/ツールのバージョンなど)

python 3.7
Django version 2.2.3

参考書のサンプル通りに書いているつもりなのですが、
エラーが出てしまっている為、ご教授いただけると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

djangoもpythonも専門外ですが、

    (public_usre,public_group) = get_public()
    groups = Group.objects.filter(Q(owner=owner)|Q(owner=public_user)).filter(title__in=glist)

ここではないですか?
最初に public_usre とスペルミスしてるので次の行の owner=public_user で未定義エラーになってるんじゃないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/11 09:27

    解決いたしました!
    ご指摘ありがとうございます!

    キャンセル

  • 2019/07/11 14:27 編集

    あのー、ベストアンサーは付けて頂けないんでしょうか?

    キャンセル

  • 2019/07/13 12:08

    失念しておりました汗
    ありがとうございました!

    キャンセル

  • 2019/07/13 18:34

    お、ありがとうございます。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る