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

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

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

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

Python 3.x

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

Python

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

Q&A

0回答

242閲覧

ログイン失敗時にエラーメッセージが出るようにしたい 

PIROSHKI

総合スコア0

Django

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2023/06/03 01:36

実現したいこと

Djangoを使ってログイン機能を実装中です。
ログイン成功時には正しい挙動をしていますが、失敗した際に、何もエラーメッセージが出ないため、
正しく表示されるようにしたい。
ここに実現したいことを箇条書きで書いてください。

  • [エラーメッセージを表示させたい]

前提

Macos version:13.3.1 (a)
Python version:3.11.0a6
Django version:4.2

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

該当のソースコード

python(views.py)

1from django.contrib.auth.decorators import login_required, user_passes_test 2from django.contrib.auth.views import LoginView 3from django.contrib import messages 4from .forms import CustomAuthenticationForm, CustomUserCreationForm 5from .models import CustomUser 6from django.shortcuts import render, redirect, get_object_or_404 7from django.views.generic import ListView 8 9def home_view(request): 10 return render(request, 'daily_report_app/home.html') 11 12@login_required 13def user_page(request): 14 return render(request, 'daily_report_app/user_page.html', {'message': 'ユーザーページです'}) 15 16class SuperUserListView(ListView): 17 model = CustomUser 18 template_name = 'daily_report_app/superuser_page.html' 19 context_object_name = 'users' 20 21@user_passes_test(lambda u: u.is_superuser) 22def superuser_page(request): 23 users = CustomUser.objects.all() 24 return render(request, 'daily_report_app/superuser_page.html', {'users': users, 'message': '管理者ページです'}) 25 26class CustomLoginView(LoginView): 27 authentication_form = CustomAuthenticationForm 28 template_name = 'registration/login.html' 29 30 def form_invalid(self, form): 31 print("Form is invalid") 32 messages.error(self.request, 'Invalid email or password. Please try again.') 33 return super().form_invalid(form) 34 35def register_view(request): 36 if request.method == 'POST': 37 form = CustomUserCreationForm(request.POST) 38 if form.is_valid(): 39 form.save() 40 return redirect('user_page') 41 else: 42 form = CustomUserCreationForm() 43 44 form_errors = {} 45 for field in form: 46 if field.errors: 47 form_errors[field.name] = field.errors 48 49 return render(request, 'registration/register.html', {'form': form, 'form_errors': form_errors}) 50 51 52def user_list(request): 53 users = CustomUser.objects.all() 54 return render(request, 'daily_report_app/user_list.html', {'users': users}) 55 56def user_detail(request, pk): 57 user = get_object_or_404(CustomUser, pk=pk) 58 # ユーザー詳細情報を表示するための処理を追加 59 return render(request, 'daily_report_app/user_detail.html', {'user': user}) 60

python(urls.py)

1from django.urls import path 2from .views import home_view, user_page, superuser_page, CustomLoginView, register_view, user_detail, user_list 3 4urlpatterns = [ 5 path('', home_view, name='home'), 6 path('user/', user_page, name='user_page'), 7 path('superuser/', superuser_page, name='superuser_page'), 8 path('login/', CustomLoginView.as_view(), name='login'), 9 path('register/', register_view, name='register'), 10 path('user/<int:pk>/', user_detail, name='user_detail'), 11 path('users/', user_list, name='user_list'), 12]

base_generic.html

1{% load static %} 2 3<html> 4 <head> 5 <link rel="stylesheet" type="text/css" href="{% static 'daily_report_app/style.css' %}"> 6 </head> 7<body> 8 <header> 9 <h1>Your Header Here</h1> 10 </header> 11 <div class="content-wrapper"> 12 {% block content %} 13 {% endblock %} 14 {% if messages %} 15 <ul class="messages"> 16 {% for message in messages %} 17 <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 18 {% endfor %} 19 </ul> 20 {% endif %} 21 </div> 22 <footer> 23 <p>Your Footer Here</p> 24 </footer> 25</body> 26</html>

login.html

python(forms.py)

1from django import forms 2from django.contrib.auth.forms import AuthenticationForm,UserCreationForm 3from django.contrib.auth import authenticate 4from .models import CustomUser 5 6 7class CustomAuthenticationForm(AuthenticationForm): 8 username = forms.CharField( 9 label='Email', 10 widget=forms.TextInput(attrs={'placeholder': 'Email'}), 11 error_messages={'required': 'Please enter your email address.'} 12 ) 13 14 def clean(self): 15 username = self.cleaned_data.get('username') 16 password = self.cleaned_data.get('password') 17 18 if username and password: 19 self.user_cache = authenticate(self.request, username=username, password=password) 20 if self.user_cache is None: 21 raise forms.ValidationError('Invalid email or password. Please try again.') 22 23 self.confirm_login_allowed(self.user_cache) 24 return self.cleaned_data 25 26class CustomUserCreationForm(UserCreationForm): 27 class Meta: 28 model = CustomUser 29 fields = ('username', 'email', 'password1', 'password2')

python(srttings.py)

1""" 2Django settings for my_project project. 3 4Generated by 'django-admin startproject' using Django 4.2.1. 5 6For more information on this file, see 7https://docs.djangoproject.com/en/4.2/topics/settings/ 8 9For the full list of settings and their values, see 10https://docs.djangoproject.com/en/4.2/ref/settings/ 11""" 12 13from pathlib import Path 14 15# Build paths inside the project like this: BASE_DIR / 'subdir'. 16BASE_DIR = Path(__file__).resolve().parent.parent 17 18 19# Quick-start development settings - unsuitable for production 20# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ 21 22# SECURITY WARNING: keep the secret key used in production secret! 23SECRET_KEY = "django-insecure-k9w98t=t8kg$v1y%fxoq0pw4pklxs=s1b_qn^mumwa-_ss&vp-" 24 25# SECURITY WARNING: don't run with debug turned on in production! 26DEBUG = True 27 28ALLOWED_HOSTS = [] 29 30 31# Application definition 32 33INSTALLED_APPS = [ 34 "django.contrib.admin", 35 "django.contrib.auth", 36 "django.contrib.contenttypes", 37 "django.contrib.sessions", 38 "django.contrib.messages", 39 "django.contrib.staticfiles", 40 'daily_report_app', 41] 42 43MIDDLEWARE = [ 44 "django.middleware.security.SecurityMiddleware", 45 "django.contrib.sessions.middleware.SessionMiddleware", 46 "django.middleware.common.CommonMiddleware", 47 "django.middleware.csrf.CsrfViewMiddleware", 48 "django.contrib.auth.middleware.AuthenticationMiddleware", 49 "django.contrib.messages.middleware.MessageMiddleware", 50 "django.middleware.clickjacking.XFrameOptionsMiddleware", 51] 52 53ROOT_URLCONF = "my_project.urls" 54 55TEMPLATES = [ 56 { 57 "BACKEND": "django.template.backends.django.DjangoTemplates", 58 "DIRS": [], 59 "APP_DIRS": True, 60 "OPTIONS": { 61 "context_processors": [ 62 "django.template.context_processors.debug", 63 "django.template.context_processors.request", 64 "django.contrib.auth.context_processors.auth", 65 "django.contrib.messages.context_processors.messages", 66 ], 67 }, 68 }, 69] 70 71WSGI_APPLICATION = "my_project.wsgi.application" 72 73 74# Database 75# https://docs.djangoproject.com/en/4.2/ref/settings/#databases 76 77DATABASES = { 78 "default": { 79 "ENGINE": "django.db.backends.sqlite3", 80 "NAME": BASE_DIR / "db.sqlite3", 81 } 82} 83 84 85# Password validation 86# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators 87 88AUTH_PASSWORD_VALIDATORS = [ 89 { 90 "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", 91 }, 92 { 93 "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", 94 }, 95 { 96 "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", 97 }, 98 { 99 "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", 100 }, 101] 102 103 104# Internationalization 105# https://docs.djangoproject.com/en/4.2/topics/i18n/ 106 107LANGUAGE_CODE = "ja" 108 109TIME_ZONE = "UTC" 110 111USE_I18N = True 112 113USE_TZ = True 114 115 116# Static files (CSS, JavaScript, Images) 117# https://docs.djangoproject.com/en/4.2/howto/static-files/ 118 119STATIC_URL = "static/" 120 121# Default primary key field type 122# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field 123 124DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" 125 126 127AUTH_USER_MODEL = 'daily_report_app.CustomUser' 128 129 130LOGIN_REDIRECT_URL = 'superuser_page' 131 132AUTHENTICATION_BACKENDS = ['daily_report_app.backends.EmailBackend'] 133 134MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' 135

試したこと

コンソールにもエラーメッセージが出ないので、views.pyのCustomLoginViewクラス内でprint()を使用してみましたが、何もメッセージが表示されませんでした。
エラーに際にこの部分が呼び出されていないことはわかるのですが、呼び出す方法がわかりませんでした。
誤った情報を入力した際にきちんとエラーメッセージ出るようにしたいです。よろしくお願いします。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/06/04 04:30

django使いではないのでこちらに… https://qiita.com/nakkun/items/9c363647588120aa5a4f の感じですと、うまくいったらforms.is_valid()のifの内側に流れているので、質問のコードでも同じようにforms.is_valid()のifが外れた側にログイン失敗通知を出せばうまくいきそうな気がします。 もしこれでダメであれば「if request.method == 'POST':」を外すと動きそうにも見えます。 …全部カンです、根拠はありません💦
PIROSHKI

2023/06/05 11:36

ありがとうございます!ヒントをいただき、重複した記述(forms.pyとviews.py)を解消したところ、エラーメッセージが表示されました。 ただ、本来はカスタムしたメッセージを出したいのですが、デフォルトメッセージしか表示されない問題は残って居る状態です。 そちらは自分でまた解決を試みようと思ってます。大変助かりました。改めましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問