django-registration create_user() неожиданное ключевое слово

Я пытаюсь создать собственный профиль для добавления дополнительных полей в django-registration, Вот код, который у меня есть до сих пор -

в models.py

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

class Profile(models.Model):
    user = models.ForeignKey(User, unique=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    password = models.CharField(max_length=50) 

И в settings.py

AUTH_PROFILE_MODULE = 'myproject.Profile'

Тем не менее, я получаю следующую ошибку при попытке использовать create_user(). Вот что происходит, когда я набираю это в интерпретаторе -

>>> from django.contrib.auth.models import User
>>> User.objects.create_user(first_name='tom',last_name='smith',email='ts@gmail.com',password='hello')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: create_user() got an unexpected keyword argument 'first_name'

Чего мне не хватает для того, чтобы create_user() распознать эти новые столбцы? Спасибо.

2 ответа

Решение

Есть ряд вещей, которые вы делаете неправильно здесь

Во-первых, это не поля модели User, а модель Profile. Поэтому не удивительно, что метод диспетчера пользователей их не распознает. Вам нужно будет определить объект User обычным способом с помощью create_user, а затем определить экземпляр профиля, используя этого пользователя.

Во-вторых, create_user не принимает все имена полей в качестве аргументов ключевых слов - он принимает только имя пользователя, адрес электронной почты и пароль. Опять же, вам нужно будет самостоятельно установить другие поля.

Однако я совсем не понимаю, почему вы определили именно эти поля. Все они доступны во встроенной модели User. В частности, вам определенно не следует определять собственное поле пароля, если только вы не напишите некоторый код для хранения пароля в виде хэша, а не в виде простого текста.

username, first_name, last_name, email, password = kwargs['username'], kwargs['first_name'], kwargs['last_name'], kwargs['email'], kwargs['password1']
        user = User(username=username, email=email, first_name=first_name, last_name=last_name)
        user.set_password(password)
        user.save()

это решение

Другие вопросы по тегам