Пользователь зарегистрирован, но не может войти в систему django
Я пытался реализовать настраиваемый вход/регистрацию пользователей в django. но только один пользователь может войти в систему, а другие пользователи не входят. Область регистрации выглядит нормально, потому что пользователь может легко зарегистрироваться.
Вот мои коды Я предполагаю, что есть проблема с CSRF токеном, но я не знаю, где его обновить В представлении Register
def registerPage(request):
form = UserForm()
if request.method == 'POST':
print(request.POST)
form = UserForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.user_name = user.user_name.lower()
user.save()
login(request, user)
return redirect('home')
else:
messages.error(request, 'An error occured duing registration!!')
return render(request, 'base/login_register.html', {'form': form})
Мои взгляды Вход
def loginPage(request):
page = "login"
if request.user.is_authenticated:
return redirect('home')
if request.method == "POST":
email = request.POST.get('email').lower()
password = request.POST.get('password')
try:
user = NewUser.objects.get(email=email)
except:
messages.error(request, 'User doesnot exist')
user = authenticate(request, email=email, password=password)
if user is not None:
login(request, user)
print("mess going on here!")
return redirect("home")
else:
messages.error(request, "Email or Password doesnot exit")
context = {'page': page}
return render(request, 'base/login_register.html', context)
Forms.py
from tkinter import Widget
from django.forms import ModelForm
from .models import NewUser
class UserForm(ModelForm):
class Meta:
model = NewUser
fields=['email','user_name','first_name','country','address','year_in_school','about','avatar']
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
self.fields['email'].widget.attrs.update({'class': 'form-control'})
# self.fields['email','user_name','first_name','country','address','year_in_school','about'].widget.attrs.update({'class': 'form-control'})
self.fields['user_name'].widget.attrs.update({'class': 'form-control'})
self.fields['first_name'].widget.attrs.update({'class': 'form-control'})
self.fields['country'].widget.attrs.update({'class': 'form-control'})
self.fields['address'].widget.attrs.update({'class': 'form-control'})
self.fields['year_in_school'].widget.attrs.update({'class': 'form-control'})
self.fields['about'].widget.attrs.update({'class': 'form-control'})
Login/Register.html
<form
method="POST"
action=""
class="form-contact"
data-toggle="validator"
novalidate="true"
>
{% csrf_token %}
<div class="col-sm-6 col-md-6">
<div class="form-group">
<input
type="text"
class="form-control"
id="p_name"
name="email"
placeholder="Enter Email"
required=""
/>
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-sm-6 col-md-6">
<div class="form-group">
<input
type="password"
name="password"
class="form-control"
id="p_email"
placeholder="Enter Password"
required=""
/>
<div class="help-block with-errors"></div>
</div>
</div>
<div class="form-group">
<div id="success"></div>
<button type="submit" value="Submit" class="btn btn-primary">
Login
</button>
</div>
<p>Haven't signed up yet?</p>
<a href="{% url 'register' %}">Sign up</a>
</form>
Модель нового пользователя В модели NewUser
class NewUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
user_name = models.CharField(max_length=150, unique=True)
first_name = models.CharField(max_length=150, blank=True)
avatar = models.ImageField(null=True,default="avatar.svg")
start_date = models.DateTimeField(default=timezone.now)
address = models.CharField(max_length=150, default="Wuhan")
country = models.CharField(max_length=150,)
year_in_school = models.CharField(
max_length=2,
default=FRESHMAN,
)
about = models.TextField(_(
'about'), max_length=500, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
objects = CustomAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['user_name', 'first_name']
В вашем представлении loginPage вы вызываете authenticate следующим образом:
user = authenticate(request, email=email, password=password)
Если вы используете значение по умолчанию в настройках для AUTHENTICATION_BACKENDS, стандартная функция authenticate принимает в качестве именованных аргументов только username и password. Если передать email, она не вернет пользователя.
Если вам нужно войти в систему, используя электронную почту, вы можете написать пользовательский бэкенд аутентификации. На этот популярный вопрос есть ответы, которые могут помочь.