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

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

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

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

Python

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

Q&A

解決済

1回答

4247閲覧

Djangoのログイン済みトップページでuser.is_authenticatedがTrueにならない

fpip

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2021/09/13 09:25

編集2021/09/13 15:06

前提・実現したいこと

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 shelluser=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

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

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

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

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

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

guest

回答1

0

自己解決

利用目的上問題がなかったため、ログインだけbase.htmlを使わずに独立したページを作ることにしました。

投稿2021/10/02 14:23

fpip

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問