Я могу войти в систему только с учетной записью администратора, но мне нужно сделать это с помощью пользовательской модели пользователя
Пользователи могут зарегистрироваться без проблем, но они не могут войти, только суперпользователь Я использую пользовательскую модель пользователя, так что я могу войти в систему, используя только email и пароль, я уже пытался использовать встроенные шаблоны django для входа, но они не работают, они выдают ту же ошибку
Когда я пытаюсь войти в систему как обычный пользователь, он выдает мне эту ошибку
<ul class="errorlist"><li>__all__<ul class="errorlist nonfield"><li>Invalid login</li></ul></li></ul>
Мой models.py
class CustomUserManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError("Users must have an email address")
if not username:
raise ValueError("Users must have a username")
user = self.model(
email = self.normalize_email(email),
username = username,
)
user.set_password(password)
user.save(using = self.db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email = self.normalize_email(email),
password = password,
username = username,
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using = self.db)
class CustomUser(AbstractBaseUser):
email = models.EmailField(verbose_name="email", max_length=150, unique=True)
username = models.CharField(max_length=150, unique=True)
# password = models.CharField(max_length=150)
date_joined = models.DateTimeField(verbose_name="date joined", auto_now_add=True)
last_login = models.DateTimeField(verbose_name="last login", auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = CustomUserManager()
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
Мой forms.py
class login_form(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
class Meta:
model = CustomUser
fields = ('email', 'password')
def clean(self):
email = self.cleaned_data['email']
password = self.cleaned_data['password']
if not authenticate(email = email, password = password):
raise forms.ValidationError("Invalid login")
Мой views.py
from django.contrib.auth import authenticate, login as auth_login
def login(request):
#The user is already logged
user = request.user
if user.is_authenticated:
return redirect("/dashboard/")
#Form sended
if request.method == "POST":
form = login_form(request.POST)
#The form passed the validation
if form.is_valid():
print('The form is valid')
email = request.POST.get('email')
email = BaseUserManager.normalize_email(email)
password = request.POST.get('password')
user = authenticate(email = email, password = password)
if user is not None:
print('Login sucesfull')
auth_login(request, user)
return redirect('/dashboard/')
else:
print(form.errors)
#The form is no sended
else:
form = login_form()
return render(request, 'ClientApp_pages/login.html', {"form":form})
Логин.html
<div class="login">
<form action="" method="POST">{% csrf_token %}
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div class="alert alert-danger">
<strong style="color: red;">{{ error|escape }}</strong>
</div>
{% endfor %}
{% endfor %}
{% endif %}
<ul>
<li>
<label for="{{ form.status.id_for_label }}">Email : </label>
{{ form.email }}
</li>
<li>
<label for="{{ form.status.id_for_label }}">Password : </label>
{{ form.password }}
</li>
</ul>
<input type="submit" value="Ok" >
</form>
</div>