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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2252閲覧

djangoでログインしたユーザーにのみマイページボタンを表示させたいのですが問題が発生しております。

nre

総合スコア35

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/23 05:13

編集2020/10/23 05:18

前提・実現したいこと

現在djangoでwebアプリケーションを開発しております。
ここでは会員登録とログイン機能があります。
そして会員登録してログインしたユーザーにのみ【マイページ、ログアウト】ボタンを表示させたいです。
その時にif user.is_authenticatedでログインしたユーザーかどうかを判断しボタンを表示させておりましたが問題が発生しました。

html

1<div class="float-right pt-1"> 2 {% if user.is_authenticated %}<!--if関数でアクティブユーザーか否かの判断--> 3 <a class="btn btn-outline-primary" id="name11" href="{% url 'register:user_detail' user.pk %}" role="button"><font size="2">マイページ</font></a> 4 <a class="btn btn-danger" href="{% url 'register:logout' %}" role="button"><font size="2">ログアウト</font></a> 5 {% else %} 6 <a class="btn btn-outline-primary" href="{% url 'register:login' %}" role="button"><font size="2">ログイン</font></a> 7<!----> 8 {% endif %} 9</div>

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

topページにユーザー情報一覧ページを表示しており、
それをdetailviewでユーザーの詳細ページに飛ばすのですが、
それをクリックすると何故かアクティブユーザーと認識されて、
マイページボタンなどがナビバーに表示されてしまいます。
イメージ説明

該当のソースコード

django

1#urls.py 2 3urlpatterns = [ 4 path('', views.TopView.as_view(), name='top'), 5 path('<int:pk>/', views.DetailView.as_view(), name='detail'), 6 path('login/', views.Login.as_view(), name='login'), 7]

django

1#views.py 2 3class TopView(generic.ListView): 4 """トップページにユーザー情報一覧表示""" 5 model = User 6 template_name = 'register/top.html' 7 paginate_by = 8 8 queryset = User.objects.order_by('-created_at') 9 10 def get_context_data(self, **kwargs): 11 """条件表示""" 12 context = super().get_context_data(**kwargs) 13 context["like_list"] = User.objects.order_by('-like')[:5] 14 return context 15 16 17class DetailView(generic.DetailView): 18 """ユーザーの詳細ページ""" 19 model = User 20 template_name = 'register/detail.html'

html

1#detail.html 2 3<div class="row"> 4 {% for product in user_list %} 5 <div class="col-6 col-md-4 col-lg-3 mb-2"> 6 <a href="{% url 'register:detail' pk=product.pk %}" class="card noline1" style="width: 100%;"> 7 {% if product.top_image %} 8 <img class="card-img-top mt-1" src="{{ product.top_image.url }}"> 9 {% else %} 10 <img class="card-img-top mt-1" src="https://django-for-s3.s3-ap-northeast-1.amazonaws.com/static/media/unknown_image.png"><!--デフォルトアンノーン画像表示 --> 11 {% endif %} 12 <div class="card-body"> 13 <h6 class="card-skill">{{ product.nick_name}}</h6> 14 </div> 15 </a> 16 </div><!--表示カードデザインはここまで--> 17 {% endfor %} 18 </div> 19

django

1#models.py 2 3class User(AbstractBaseUser, PermissionsMixin): 4 """カスタムユーザーモデル.""" 5 email = models.EmailField(_('email address'), unique=True) 6 first_name = models.CharField(_('first name'), max_length=30, blank=True) 7 last_name = models.CharField(_('last name'), max_length=150, blank=True) 8 """下記省略"""

試したこと

detailviewを使って詳細ページに飛ばす際にpkを使用し、urlがhttp://127.0.0.1:8000/13/となり
pkの13部分がアクティブユーザーと誤認させているかと思いUrls.pyを下記の様に修正し、htmlのリンクも修正しましたが同じ結果となりました。

django

1#urls.pyを二通りで変更してみました。 2 3path('<int:id>/', views.DetailView.as_view(), name='detail'), 4path('user/<int:id>/', views.DetailView.as_view(), name='detail'), 5 6#htmlのリンク部分 7<a href="{% url 'register:detail' id=product.id %}">

またはナビバー内の
{% if user.is_authenticated %}を必須フィールドであるメール情報の有無で表示する様にしてみましたが{% if user.mail %}だめでした。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

遅くなってすみません。
いま考えるとテンプレートは正しく見えると書きましたが、{% if user.is_authenticated %}{% if request.user.is_authenticated %}に変更すれば正しく動くと思います。
おっしゃるとおり、コンテキストで渡しているuserはDetailViewで該当Userのオブジェクトが入ってますね。

投稿2020/10/27 06:15

technobic

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nre

2020/10/27 08:21

大変お忙しい中、 丁寧にご回答して頂き誠にありがとうございます。 お陰様で無事に問題を解決する事ができました! 本当にありがとうございます!!
guest

0

テンプレートの条件分岐は正しく書かれているように見えるため、考えられる原因は以下の2つです。

1.「未ログインの状態」が正しく作れていない。
→ブラウザのシークレットウィンドウなどを使うと確実に未ログインの状態を作れます。
→「ログアウト」ボタンを押下後もログアウトボタンが出るのならログアウトの処理に問題がある可能性があります。

2.テンプレートのキャッシュが残っている(可能性低)。
→サーバーを再起動するか、python manage.py clear_cacheでキャッシュを削除できます。

投稿2020/10/24 06:48

technobic

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nre

2020/10/24 11:32 編集

大変お忙しい中、ご回答していただき誠にありがとうございます。 記載していただいたようにシークレットウィンドウでも同じような現象が起きました。また、ログアウト後には正常にログアウトボタンは非表示なっているため正常に処理ができているようです。 サーバーの再起動も行いましたこちらもダメでした。 私が考えるに各ユーザーの詳細ページはdetailviewでpkを使用して表示しております。 その際にurlが「http://127.0.0.1:8000/user_profile/12/」とpkが含まれたものになります。 本来であれば会員登録をした人が与えられるpkが、 未ログインユーザーがリンクを踏むことによりほかの人のpkがリンクに含まれることで「is_authenticated」が誤作動をおこしてボタンを表示させているのではないでしょうか? technobic様のご意見をお聞かせいただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問