前提・実現したいこと
DjangoでWebアプリケーションを作っています。
ユーザがログインしている時のみbase.html
でログアウトのリンクを表示させたいと考えています。
発生している問題・エラーメッセージ
以下のようにis_authenticated
を使って表示させようと考えていたのですが、ログインしていても表示されません。
{% if user.is_authenticated %} <p><a href="{% url 'logout' %}">ログアウト</a></p> {% endif %}
念の為リンク以外のテキストでも試してみましたが、表示されません。
% if user.is_authenticated %} <p>true</p> {% endif %}
なお、以下のようなログインユーザ名の取得・表示などはできています
<h1>{{ user }}の実績</h1> <!-- <h1>'ユーザ名'の実績</h1> -->
自分の検索では、Djangoテンプレートにおけるrequest.user.is_authenticated
を使った事によるエラーは見つけられたのですが、user.is_authenticated
についてのエラーは見つけられませんでした(見落としがあったら申し訳ありません)。
問題と考えられる箇所や代替手段がありましたら、ご教授いただけますと幸いです。
初学者のため、代替案といえばログインが必要なページテンプレートのみログインリンクを貼っていく程度しか思いつきませんでした…。
試したこと
python manage.py shell
でuser=User.objects.get(username='ユーザ名')
を試してTrue
が返されました。
>>> user = User.objects.get(username='ユーザ名') >>> user.is_authenticated True
- 条件分岐でこうした場合はログインしていてもしていなくても「ログイン」が表示されます。
{% if user.is_authenticated %} <p><a href="{% url 'logout' %}">ログアウト</a></p> {% else %} <p><a href="{% url 'login' %}">ログイン</a></p> {% endif %}
form
を使ったページではなぜかTrue
になりました。True
にならないのはログインしてアクセスする最初のページだけのようです。
ページ構成
- ログインページ
- 実績を確認するページ
- フォームで入力するページ
urlpatterns = [ path('', views.status_list, name='status_list'), path('post/webeval', views.web_eval_form, name='web_eval'), path('login/', auth_views.LoginView.as_view(template_name='status/login.html'), name='login'), path('logout/', auth_views.LogoutView.as_view(), name='logout'), ]
補足情報(FW/ツールのバージョンなど)
ユーザモデル
関係しているかわかりませんが、アプリのmodels.py
にユーザモデルを作っています。
from django.db import models from django.conf import settings from django.utils import timezone from django.apps import apps from django.contrib import auth from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.contrib.auth.validators import UnicodeUsernameValidator from django.core.mail import send_mail from django.utils.translation import gettext_lazy as _ from django.core.validators import MaxValueValidator, MinValueValidator class UserManager(BaseUserManager): use_in_migrations = True def _create_user(self, username, email, password, **extra_fields): """ Create and save a user with the given username, email, and password. """ if not username: raise ValueError('The given username must be set') email = self.normalize_email(email) # Lookup the real model class from the global app registry so this # manager method can be used in migrations. This is fine because # managers are by definition working on the real model. username = self.model.normalize_username(username) user = self.model(username=username, email=email, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_user(self, username, email=None, password=None, **extra_fields): extra_fields.setdefault('is_staff', False) extra_fields.setdefault('is_superuser', False) return self._create_user(username, email, password, **extra_fields) def create_superuser(self, username, email=None, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) if extra_fields.get('is_staff') is not True: raise ValueError('Superuser must have is_staff=True.') if extra_fields.get('is_superuser') is not True: raise ValueError('Superuser must have is_superuser=True.') return self._create_user(username, email, password, **extra_fields) def with_perm(self, perm, is_active=True, include_superusers=True, backend=None, obj=None): if backend is None: backends = auth._get_backends(return_tuples=True) if len(backends) == 1: backend, _ = backends[0] else: raise ValueError( 'You have multiple authentication backends configured and ' 'therefore must provide the `backend` argument.' ) elif not isinstance(backend, str): raise TypeError( 'backend must be a dotted import path string (got %r).' % backend ) else: backend = auth.load_backend(backend) if hasattr(backend, 'with_perm'): return backend.with_perm( perm, is_active=is_active, include_superusers=include_superusers, obj=obj, ) return self.none() class User(AbstractBaseUser, PermissionsMixin): """ An abstract base class implementing a fully featured User model with admin-compliant permissions. Username and password are required. Other fields are optional. """ username_validator = UnicodeUsernameValidator() username = models.CharField( _('username'), max_length=150, unique=True, help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), validators=[username_validator], error_messages={ 'unique': _("A user with that username already exists."), }, ) first_name = models.CharField(_('first name'), max_length=150, blank=True) last_name = models.CharField(_('last name'), max_length=150, blank=True) email = models.EmailField(_('email address'), blank=True) is_staff = models.BooleanField( _('staff status'), default=False, help_text=_('Designates whether the user can log into this admin site.'), ) is_active = models.BooleanField( _('active'), default=True, help_text=_( 'Designates whether this user should be treated as active. ' 'Unselect this instead of deleting accounts.' ), ) date_joined = models.DateTimeField(_('date joined'), default=timezone.now) objects = UserManager() EMAIL_FIELD = 'email' USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['email'] class Meta: verbose_name = _('user') verbose_name_plural = _('users') #abstract = True def clean(self): super().clean() self.email = self.__class__.objects.normalize_email(self.email) def get_full_name(self): """ Return the first_name plus the last_name, with a space in between. """ full_name = '%s %s' % (self.first_name, self.last_name) return full_name.strip() def get_short_name(self): """Return the short name for the user.""" return self.first_name def email_user(self, subject, message, from_email=None, **kwargs): """Send an email to this user.""" send_mail(subject, message, from_email, [self.email], **kwargs)
バージョン
Python 3.9.6
asgiref 3.4.1
Django 3.2.5
django-cors-headers 3.7.0
djangorestframework 3.12.4
djangorestframework-jwt 1.11.0
pip 21.2.4
PyJWT 1.7.1
pytz 2021.1
setuptools 57.0.0
sqlparse 0.4.1

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。