Как сделать вход в django через таблицу, отличную от auth_users?
Не уверен, что я делаю неправильно, я оставлю ниже свои файлы. Метод register работает отлично, но когда я делаю login, каждый раз вывод user is none.
Кто-нибудь знает, что я сделал не так?
Я прочитал документацию по аутентификации в django, но не могу обнаружить проблему. Я видел, что было несколько вопросов по этой проблеме, но я не смог решить свой. settings.py
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('register/', views.registerMethod, name="register"),
path('login/', views.loginMethod, name="login"),
path('', include("main.urls")),
path('', include("django.contrib.auth.urls")),
]
views.py
def registerMethod(request):
if request.method=='POST':
if request.POST.get('email') and request.POST.get('firstname') and request.POST.get('lastname') and request.POST.get('password'):
user = NewUser()
user.first_name = request.POST.get('firstname')
user.last_name = request.POST.get('lastname')
user.password = request.POST.get('password')
user.email = request.POST.get('email')
password = user.password.encode('utf-8')
# Hash the ecoded password and generate a salt:
hashedPassword = bcrypt.hashpw(password, bcrypt.gensalt(10))
user.password = str(hashedPassword)
user.first_name = CleanString(user.first_name)
user.last_name = CleanString(user.last_name)
user.email = CleanString(user.email)
message = None
if UserExistsByEmail(user.email):
message = 'You are already registered!'
return render(request, 'register/register.html', {"message":message})
else:
user.save()
message = 'You have succesfully created an account!'
return render(request, 'registration/login.html', {"message":message})
else:
return render(request, 'register/register.html')
else:
return render(request, 'register/register.html')
def loginMethod(request):
if request.method == "POST":
email = request.POST.get('email')
password = request.POST.get('password')
user = authenticate( email=email, password=password)
if user is not None:
login(request, user)
message = 'You are logged in!'
return render(request, 'registration/login.html', {"message":message})
else:
message = 'user is None!'
return render(request, 'registration/login.html', {"message":message})
else:
return render(request, 'registration/login.html')
models.py
from django.db import models
from datetime import datetime
# Create your models here.
class NewUser(models.Model):
username = models.CharField(max_length=100, default='noUsername')
password = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
is_staff = models.BooleanField(default=0)
is_super_user = models.BooleanField(default=0)
is_active = models.BooleanField(default=1)
date_joined = models.DateTimeField(default=datetime.now)
USERNAME_FIELD = "email"
class Meta:
db_table = "users"
def __str__(self):
return self.email
Вы должны установить AUTH_USER_MODEL в вашем settings.py. Django должен знать, какого "Пользователя" использует ваш проект.
AUTH_USER_MODEL = 'your_app.NewUser'
Но вы не хотите, чтобы ваш NewUser был models.Model, он должен быть AbstractUser или другим классом CustomUser. Прежде чем продолжить, пожалуйста, прочитайте некоторые официальные документы о настройке пользователя .