前提・実現したいこと
現在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 %}だめでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/27 08:21