Данные не хранятся в базе данных для поля выбора для UserRegsitrationForm django - PullRequest
1 голос
/ 05 октября 2019

Я расширил UserCreationForm в Django, добавив дополнительные поля: поле «Электронная почта» и «Выбор». Теперь, когда я заполняю эти данные в регистрационной форме и отправляю ее. В базе данных хранится только электронная почта, а не поле выбора (т.е. статус в коде). Однако, когда я просматриваю поля моей формы в консоли, поле выбора отображается. Но когда я получаю доступ к атрибуту с помощью оболочки django, я получаю сообщение об ошибке

from django.contrib.auth.models import User
users = User.objects.all()
users[6].email
Output : masterhimanshupoddar@gmail.com # success

users[6].status
Error: AttributeError                            Traceback (most recent call last)
<ipython-input-7-c9d2701fa919> in <module>()
----> 1 users[6].status

AttributeError: 'User' object has no attribute 'status'

Вот мой forms.py

from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User

class SignUpForm(UserCreationForm):
    STATUS_CHOICES = (
        (1, ("CEO")),
        (2, ("Dev Manager")),
        (3, ("Testing Manager")),
        (4, ("Developer")),
        (5, ("Test Engineer"))
    )
    email = forms.EmailField(required=True,
                         label='Email',
                         error_messages={'exists': 'Oops'})
    status = forms.ChoiceField(choices = STATUS_CHOICES, label="Designation", initial='Developer', widget=forms.Select(), required=True)



    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2", "status")

        def save(self, commit=True):
            user = super(UserCreateForm, self).save(commit=False)
            user.email = self.cleaned_data["email"]
            user.status = self.cleaned_data["status"]
            if commit:
                user.save()
            return user

Почему я получаюошибка. Куда я иду не так. Любая помощь будет высоко оценена.

1 Ответ

2 голосов
/ 05 октября 2019

Недостаточно добавить поле в форму, вы также должны добавить его в модель.

Для этого вам необходимо создать пользовательский класс в вашем models.py:

from django.contrib.auth.models import AbstractUser

STATUS_CHOICES = (
    (1, ("CEO")),
    (2, ("Dev Manager")),
    (3, ("Testing Manager")),
    (4, ("Developer")),
    (5, ("Test Engineer"))
)
class User(AbstractUser):
    status forms.ChoiceField(choices = STATUS_CHOICES, verbose_name ="Designation")

Затем вам нужно изменить настройки AUTH_USER_MODEL, чтобы они указывали на вашу модель соответственно. Предполагая, что приложение, которое содержит вашу новую пользовательскую модель, называется my_app, настройка будет выглядеть следующим образом:

AUTH_USER_MODEL = 'my_app.User'

Вы также должны убедиться, что любые поля ForeignKey в вашей модели используют AUTH_USER_MODEL вместо django.contrib.auth.models.User:

из django.conf настройки импорта из моделей импорта django.db

class Article(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

Также не забудьте создать и применить миграцию базы данных:

python manage.py makemigrations
python manage.py migrate

К сожалению, изменение пользовательской модели в середине проекта может привести к сложным проблемам, поэтому, если вы все еще находитесь на ранней стадии проекта, может быть проще всего удалить и заново создать базу данных.

Обратитесь к вашемумодель с get_user_model() в вашей форме:

from django.contrib.auth import get_user_model

class SignUpForm(UserCreationForm):
    ...

    class Meta:
        model = get_user_model()

Пожалуйста, обратитесь к документации по Замена пользовательской модели пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...