[解決済み] ユーザー認証の方法
2022-03-09 23:14:52
質問
トラックと会社という2種類のユーザーを作成しました。以下はユーザーの登録ページです。
登録後、ユーザーがトラックなのか会社なのかのデータがデータベースに行きます。
はEmailとPasswordのみ入力します。私のカスタムユーザー作成フォームでは、username = email というフィールドを追加しました。
有効な認証情報でログインしようとすると、ページがユーザータイプに応じた特定のページにリダイレクトされないのです。代わりに、login.htmlで無効な認証情報のために作成したエラーが発生します - "あなたの電子メールとパスワードが一致しませんでした。もう一度お試しください。
以下は、私のコードです。
views.py。
def login_view(request):
title = "Login"
if request.method == 'POST':
form = LoginForm(data=request.POST)
email = request.POST.get('email', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=email, password=password)
if form.is_valid():
auth.login(request, user)
user_type = form.cleaned_data['Label']
if user.is_active & user_type == 'Truck':
return HttpResponseRedirect('/post_load/')
elif user_type == 'Company':
return HttpResponseRedirect('/live_deal/')
else:
form = LoginForm()
return render(request, 'registration/login.html', {'form' : form, 'title': title})
urls.py。
# url(r'^login/$', views.login_view),
# url(r'^accounts/login/$', views.login_view),
url(r'^login/$', 'django.contrib.auth.views.login', {'authentication_form': LoginForm}),
url(r'^accounts/login/$', 'django.contrib.auth.views.login', {'authentication_form': LoginForm}),
forms.py。
class LoginForm(auth.forms.AuthenticationForm):
email = forms.EmailField(label=_("Email"),widget=forms.EmailInput)
CHOICES= (('Truck', 'Truck'),('Company', 'Company'),)
Label = forms.ChoiceField(choices=CHOICES, label='Label', widget=forms.RadioSelect())
login.html。
{%extends "registration/header.html"%}
{% block content %}
{% if form.errors %}
<p>Your email and password didn't match. Please try again.</p>
{% endif %}
<form class="form-horizontal" method="post" action = "." >{%csrf_token%}
<div class="panel panel-default login">
<div class="panel-heading">
<span class="glyphicon glyphicon-lock"></span> Login</div>
<div class="panel-body">
<form class="form-horizontal" role="form">
<div class="form-group">
<div class='col-sm-6 col-sm-offset-4'>
<table border="0">
<div class="col-sm-4">
<tr><th><label for="id_user" class="col-sm-4 control-label">Email:</label></th><td>{{ form.email }}</td></tr> </div>
<div class="col-sm-4">
<tr><th><label for="id_password" class="col-sm-4 control-label">Password:</label></th><td>{{ form.password }}</td></tr> </div>
</table> </div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<div class="checkbox">
<label>
<input type="checkbox"/>
Remember me
</label>
</div>
</div>
</div>
<div class="form-group last">
<div class="col-sm-offset-4 col-sm-8">
<button type="submit" class="btn btn-success btn-sm">
Sign in</button>
<input type="hidden" name="next" value="/" />
<label class="col-sm-offset-3">
<a href="#">Forget Password? </a>
</label>
</div>
</div>
</form>
</div>
<div class="panel-footer">
Not Registered? <a href="/register/">Register</a></div>
</div>
</form>
{% endblock %}
解決方法は?
{% if form.errors %}
<p>Your email and password didn't match. Please try again.</p>
このエラーはかなり広範囲に渡っています。実際のエラーを見るためにループさせることができます。
もっと良い方法は、独自の認証システムを使わず、Django の組み込みシステムを使うことです。
例
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
...
else:
# Return an 'invalid login' error message.
...
Django のログインシステムを使って、フォーム、パスリセット/変更、URL、テンプレート (これは独自のテンプレートで上書きできます) を処理することも可能です。
のアール。
urlpatterns = [
url('^', include('django.contrib.auth.urls')),
]
次に
/login/
がログインページになります。
Django contrib auth モジュールで動作させた後、独自のカスタム HTML ログインフォームで拡張します。
関連
-
[解決済み] django Forms のラジオボタン
-
[解決済み] django 1.7 migrate で "table already exists" というエラーが発生する。
-
[解決済み] boto.exception.S3ResponseError.S3ResponseError。S3ResponseError: 403 Forbidden
-
django no such table: django_session エラー解決。
-
djangoにおけるrelated_nameの役割
-
[解決済み] djangoでモデルオブジェクトを一括作成する
-
[解決済み] Django のカスタムフィールドで User モデルを拡張する
-
[解決済み】DEBUG = Falseに設定すると500エラーになる。
-
[解決済み】Django: モデルフィールドのリストを取得しますか?
-
[解決済み] Django restフレームワーク、同じModelViewSetで異なるシリアライザーを使用する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】DjangoのQuerySetをリストに変換する方法とは?
-
[解決済み] boto.exception.S3ResponseError.S3ResponseError。S3ResponseError: 403 Forbidden
-
[解決済み] Django Programmingのエラーカラムが、マイグレーションを実行しても存在しない。
-
[解決済み] Django における cleaned_data の用途は?
-
django 1.8 公式ドキュメントの翻訳です。13-3 ログ
-
django_filters のインポートがうまくいかない、 'django_filter' という名前のモジュールがない
-
[解決済み] 正確な検索のための QuerySet 値は、スライシングを使用して 1 つの結果に制限する必要があります。フィルタ・エラー
-
[解決済み] Facebookログインとメール認証
-
[解決済み] ユーザー認証の方法
-
[解決済み】Djangoプロジェクトの作業ディレクトリ構造に関するベストプラクティス【終了しました