Django переопределить форму регистрации администратора по умолчанию - PullRequest
0 голосов
/ 30 марта 2020

Я знаю, как переопределить UserCreationForm, но он работает только для пользователей, но не для регистрации администратора.

Вот мой случай ...

Я изменил по умолчанию пользовательская модель и теперь у нее есть поле user_company, которое не может быть пустым:

class User(AbstractUser):
    user_company = models.ForeignKey("UserCompany", on_delete=models.CASCADE)

Я переопределил пользовательскую форму:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = get_user_model()


    def save(self, commit=True):
        user_company = UserCompany() ## create a new company and assign it to the new user
        user_company.save()

        user = super(UserRegisterForm, self).save(commit=False)        
        user.user_company_id = user_company.pk

        if commit:
            user.save()
        return user

Все это отлично работает для обычных пользователей , Но когда я пытаюсь python manage.py createsuperuser в консоли, после ввода имени пользователя и пароля администратора, я получаю сообщение об ошибке, что

поле user_company не может быть пустым

1 Ответ

1 голос
/ 30 марта 2020

Вы не создаете новую UserCompany в базе данных, просто объект в памяти, замените

user_company = UserCompany() ## create a new company and assign it to the new user

чем-то вроде

user_company = UserCompany.objects.create()

Я думаю, что лучше переместить создание UserCompany по умолчанию в функции сохранения пользователя вместо того, чтобы иметь форму

class User(AbstractUser):
   user_company = models.ForeignKey("UserCompany", on_delete=models.CASCADE)

   def save(self, *args, **kwargs):
       if getattr(self, "user_company", None) is None:
            self.user_company = UserCompany.objects.create()

       super(User, self).save(*args, **kwargs)
...