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

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

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

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

Python 3.x

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

0回答

689閲覧

【Django】ログインフォームを用いた、ログイン認証機能を正常に動作させたい

kakeru0225

総合スコア37

Django

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

Python 3.x

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2022/08/10 15:15

編集2022/08/10 15:20

下記問題についてご教示頂けますと幸いでございます。

前提

Djangoでログイン機能を実装中です。
ログインフォームでデータを送信後の挙動が上手く動作せず苦戦しております。

実現したいこと

  • ログイン機能を正常に動作させる。

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

  • フォームにデータを入力し、送信ボタンを押しても画面遷移せずに同じページに戻ってしまう。ログイン機能の実装が誤っているのか、リダイレクト先の指定方法が誤っているのか、それともほかに原因があるのかが分からずご教示頂けますと幸いでございます。

・フォーム作成(Done)
・提出されたデータとDBのデータが一致しない場合の例外処理(forms.pyで実装。正常に動作)
・ログイン後のリダイレクト先の指定(settings.pyで指定済み)

イメージ説明

該当のソースコード

foms.py

1from django import forms 2from ueru_app.models import CustomUser, Linguistic_HealthData 3from django.contrib.auth import get_user_model 4from django.core.exceptions import ValidationError 5from django.contrib.auth.forms import AuthenticationForm 6 7 8class SignUpForm(forms.ModelForm): 9 password = forms.CharField(max_length=20, widget=forms.PasswordInput()) 10 password1 = forms.CharField(max_length=20, widget=forms.PasswordInput()) 11 12 class Meta: 13 model = CustomUser 14 fields = ['username', 'email', 'password', 'password1'] 15 16 def clean_email(self): 17 email = self.cleaned_data['email'] 18 if CustomUser.objects.filter(email=email).exists(): 19 raise ValidationError("このメールアドレスは既に登録されています。他のメールアドレスを使用してください。") 20 return email 21 22 def clean_password(self): 23 password = self.cleaned_data['password'] 24 password1 = self.data.get('password1') 25 if password != password1: 26 self.add_error('password1', 'パスワードが一致しません。正しいパスワードを入力してください。') 27 raise ValidationError('パスワードが一致しません。正しいパスワードを入力してください。') 28 return password 29 30 31class LoginForm(AuthenticationForm): 32 33 email = forms.CharField(max_length=50) 34 password = forms.CharField(max_length=20, widget=forms.PasswordInput()) 35 password1 = forms.CharField(max_length=20, widget=forms.PasswordInput()) 36 37 class Meta: 38 model = CustomUser 39 fields = ['username', 'email', 'password', 'password1'] 40 41 42 def clean_username(self): 43 username = self.cleaned_data['username'] 44 if not CustomUser.objects.filter(username=username).exists(): 45 raise ValidationError("ユーザー名が正しくありません。") 46 return username 47 48 def clean_email(self): 49 email = self.cleaned_data['email'] 50 if not CustomUser.objects.filter(email=email).exists(): 51 raise ValidationError("メールアドレスが正しくありません。") 52 return email 53 54 def clean_password(self): 55 password = self.cleaned_data['password'] 56 if not CustomUser.objects.filter(password=password).exists(): 57 raise ValidationError("パスワードが正しくありません。") 58 return password 59 60class HealthDataForm(forms.ModelForm): 61 reason = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'今日の、できごとや気持ち'})) 62 action = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder':'明日に向けての、姿勢や行動'})) 63 class Meta: 64 model = Linguistic_HealthData 65 fields = ['condition', 'reason', 'action', 'message']

login.html

views.py

1from django.shortcuts import render 2from django.http import HttpResponse, HttpResponseRedirect 3from django.views.generic import CreateView 4from django.urls import reverse_lazy 5from .forms import SignUpForm, LoginForm, HealthDataForm 6from django.contrib.auth import login, authenticate 7from django.contrib.auth.views import LoginView, LogoutView 8from django.contrib.auth.mixins import LoginRequiredMixin 9 10 11def introduce_1(request): 12 return render(request, 'signup/introduce_1.html') 13 14def introduce_2(request): 15 return render(request, 'signup/introduce_2.html') 16 17def introduce_3(request): 18 return render(request, 'signup/introduce_3.html') 19 20class SignUpForm(CreateView): 21 form_class = SignUpForm 22 template_name = 'signup/signup_1.html' 23 success_url = reverse_lazy('record') 24 25 def form_valid(self, form): 26 result = super().form_valid(form) 27 user = self.object 28 login(self.request, user) 29 return result 30 31def signup_2(request): 32 return render(request, 'signup/signup_2.html') 33 34def splash(request): 35 return render(request, 'signup/splash.html') 36 37class Login(LoginView): 38 form_class = LoginForm 39 template_name = 'signup/login.html' 40 41class record(LoginRequiredMixin, CreateView): 42 form_class = HealthDataForm 43 template_name = 'record/record.html' 44 success_url = reverse_lazy('record/record1.html') 45 46class record1(CreateView): 47 form_class = HealthDataForm 48 template_name = 'record/record1.html' 49 success_url = reverse_lazy('record/record2.html') 50 51class record2(CreateView): 52 form_class = HealthDataForm 53 template_name = 'record/record2.html' 54 success_url = reverse_lazy('record/record.html') 55 56class record4(CreateView): 57 form_class = HealthDataForm 58 template_name = 'record/record4.html' 59 success_url = reverse_lazy('record/record.html') 60 61 def post(self, request, *args, **kwargs): 62 user = self.request.user

settings.py

1 2"""省略 3 4# 未ログインユーザーがアクセスした際のリダイレクト先URL 5LOGIN_URL = 'login' 6# ログインした後にリダイレクトするURL 7LOGIN_REDIRECT_URL = 'ueru/record' 8# ログアウトした後にリダイレクトするURL 9LOGOUT_REDIRECT_URL = 'ueru/login' 10

urls.py

1from django.urls import path 2from . import views 3from .views import SignUpForm, HealthDataForm 4 5 6urlpatterns = [ 7 path('introduce_1', views.introduce_1, name='introduce_1'), 8 path('introduce_2', views.introduce_2, name='introduce_2'), 9 path('introduce_3', views.introduce_3, name='introduce_3'), 10 path('signup_1', SignUpForm.as_view(), name='signup_1'), 11 path('signup_2', views.signup_2, name='signup_2'), 12 path('splash', views.splash, name='splash'), 13 path('login', views.Login.as_view()), 14 path('record', views.record.as_view(), name='record'), 15 path('record1', views.record1.as_view(), name='record1'), 16 path('record2', views.record2.as_view(), name='record2'), 17 18 path('record4', views.record4.as_view(), name='record4'), 19]

試したこと

  • フォーム入力によるログインが上手くいかなかったため、Googleログイン認証を用いたログインも試しましたが動作せず、改めてフォームによるログイン認証を実装しようと試みています
  • 下記URLを参考に、上記ソースコードとは別の方法で実装を試みました(上手くいきませんでした)

→ https://kosuke-space.com/django-loginview
→ https://daeudaeu.com/django-login-class/#i-3

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問