Django: имя пользователя пусто при создании нового пользователя при входе - PullRequest
0 голосов
/ 12 ноября 2019

Я создал пользовательские формы для входа и регистрации в Django, используя HTML / CSS, а не form.as_p в Django. У меня есть следующий код в views.py:

def login_user(request):
logout(request)
if request.POST:
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        login(request, user)
        return redirect('/mainpage/')
    else:
        login_message = "Your username or password is incorrect."
        return render(request, 'index.html', {'login_message': login_message})
return render(request, 'index.html')

def sign_up(request):
    if request.POST:
        username = request.POST['username']
        email = request.POST['email']
        password = request.POST['password']
        password_confirm = request.POST['password-confirm']
        if(valid_form(username, email, password, password_confirm)):
            #create the new user
            user = CustomUser(name=username, email=email, password=password)
            user.save()
            user = authenticate(username=username, password=password)
            login(request, user)
            return redirect('/mainpage/')
        else:
            message = "There was a problem."
            return render(request, 'index.html', {'message': message})
    return render(request, 'index.html')

У меня есть следующая модель для CustomUser в models.py:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200, null=True)
email = models.EmailField(max_length=70, null=True)
password = models.CharField(max_length=50, null=True)

Мой код работает для регистрации, и яМожно создать нового пользователя после ввода имени пользователя, адреса электронной почты и пароля. Когда я проверяю пользователей в списке пользователей на сайте администратора Django, для нового пользователя, которого я создал (ruby), сохраняется только их электронная почта, а не имя пользователя. Я считаю, что по этой причине у меня также возникают проблемы при входе в систему с этим новым пользователем.

enter image description here

Однако я не уверен, почему имя пользователя нехранится для нового пользователя, которого я создал. Любые идеи приветствуются.

Ответы [ 3 ]

2 голосов
/ 12 ноября 2019

Возможно, проблема здесь:

user = CustomUser(name=username, email=email, password=password)  # <-- Here
user.save()

Вы не сохраняете username здесь. Я думаю, что лучше сделать это либо:

user = CustomUser(name=username, email=email, username=username)
user.set_password(password)  # otherwise the password will be stored in plain text
user.save()

Или вы можете использовать create_user метод менеджера для создания пользователей.

1 голос
/ 12 ноября 2019

Согласно django doc https://docs.djangoproject.com/en/1.8/_modules/django/contrib/auth/models/, AbstractUser имеет поле имени пользователя, которое требуется и используется для аутентификации:

username = models.CharField(_('username'), max_length=30, unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, digits and '
                    '@/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(r'^[\w.@+-]+$',
                                      _('Enter a valid username. '
                                        'This value may contain only letters, numbers '
                                        'and @/./+/-/_ characters.'), 'invalid'),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        })

В вашем случае у вас есть поле name, которое является дополнительным полемв модели, но в views вы передаете имя пользователя в имя, а обязательное поле username не заполняется.

Попробуйте удалить поле «имя» в модели. Передайте имя пользователя на username

0 голосов
/ 12 ноября 2019

Поскольку ваш класс CustomUser расширяет AbstractUser (который обеспечивает полную реализацию пользователя по умолчанию в качестве абстрактной модели), вы должны использовать ту же сигнатуру (username вместо name), как указано ниже:

#create the new user
user = CustomUser(username=username, email=email, password=password)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...