ユーザー用の登録/ログインAPIを作成します。 問題は次のようなものです: 管理サイト経由でユーザーを作成すると、ログインが正しく機能しています。Django:登録ページで作成されたユーザーはauthenticate()が機能していませんが、管理者によって作成されたユーザーのために働いています
私は私によって作られたレジスタページを介してユーザを作成した場合、ログインが機能していません。(認証()関数は、そのユーザーがユーザーテーブルにまだあるにもかかわらず、Noneを返すされません。)
私はadminサイトにアクセスしてください、パスワードを変更して同じパスワードを再度入力するリンクに移動します。その後、私は正常にログインすることができます。
私は問題がパスワードを保存しているかログインしていると思います。 私はたくさんのチェックをしましたが、理解できませんでした。 私はすべてのファイルを提供しています。重要なコードを読むことができます。
models.py
from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
from datetime import datetime
class Recruiter(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
company_name = models.CharField(max_length=120)
HR_office_number = models.CharField(max_length=15)
HR_mobile_number = models.CharField(max_length=15)
def __str__(self):
return self.user.username
forms.py
from django import forms
from .models import Recruiter, User
from django.core.exceptions import ValidationError
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput(), max_length=128)
confirm_password = forms.CharField(widget=forms.PasswordInput(), max_length=128)
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email']
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
self.fields['first_name'].required = True
self.fields['last_name'].required = True
self.fields['email'].required = True
self.fields['username'].help_text = None
def clean_confirm_password(self):
password1 = self.cleaned_data.get('password')
password2 = self.cleaned_data.get('confirm_password')
if not (password1 and password2):
raise forms.ValidationError("You must confirm your password")
elif password1 != password2:
raise forms.ValidationError("Your passwords do not match")
return password1
class RecruiterForm(forms.ModelForm):
class Meta:
model = Recruiter
fields = ('company_name', 'HR_mobile_number', 'HR_office_number')
views.py
from django.shortcuts import render
from django.contrib.auth.models import User
from .models import Recruiter
from .forms import RecruiterForm, UserForm, RecruiterLoginForm
from django.urls import reverse
from django.http import HttpResponse,HttpResponseRedirect
from django.db import IntegrityError
from django.contrib.auth import authenticate, login, logout
def register(request):
context = request.POST
registered = False
if request.method == 'POST':
user_form = UserForm(data=request.POST)
recruiter_form = RecruiterForm(data=request.POST)
if user_form.is_valid() and recruiter_form.is_valid():
user = user_form.save()
try:
user.set_password(user.password)
user.save()
except IntegrityError as e:
user.delete()
return HttpResponse(e.message)
try:
recruiter = recruiter_form.save(commit=False)
recruiter.user = user
recruiter.save()
except IntegrityError as e:
recruiter.delete()
return HttpResponse(e.message)
registered = True
else:
pass
#print form.errors
else:
recruiter_form = RecruiterForm()
user_form = UserForm()
return render(request, 'recruiter/register.html', {'user_form':user_form,
'recruiter_form':recruiter_form, 'registered':registered}, context)
def login_recruiter(request):
context = request.POST
if request.user.is_authenticated():
return HttpResponse("Logged in")
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
print user
if user:
if user.is_active:
login(request, user)
return HttpResponse("Success")
else:
return HttpResponse("Not active")
else:
return HttpResponse("Invalid")
else:
return render(request, 'recruiter/login_recruiter.html', {}, context)
register.html
{% if registered %}
<h1>Registered</h1><br />
{% else %}
<form id="user_form" method="post" action="{% url 'recruiter:register' %}" enctype="multipart/form-data">
{% csrf_token %}
{{ user_form.as_p}}
{{ recruiter_form.as_p}}
<input type="submit" name="submit" value="Register" />
</form>
{% endif %}
login_recruiter.html
<form id="login_form" method="post" action="{% url 'recruiter:login_recruiter' %}">
{% csrf_token %}
Username: <input type="text" name="username" value="" size="120" />
<br />
Password: <input type="password" name="password" value="" size="120" />
<br />
<input type="submit" value="submit" />
</form>
感謝感謝感謝トン以下のコードを使用します:) –