在 ModelForm 中使用管理器方法创建实例

Creating an instance using a manager method in a ModelForm

我有一个非常简单的 ModelForm 用于创建新用户(几乎完全基于股票 UserCreationForm。我的 User 模型有自己的经理,它有一个 create_user 创建新实例、设置密码、选择退出时事通讯以及执行其他内务管理的方法。

class UserManager(BaseUserManager):
    def create_user(self, username, password=None, email=None, save=True):
        """
        Creates and saves a User with the given username, password
        and email
        """
        user = self.model(
            username=username,
            email=self.normalize_email(email)
        )

        user.set_password(password)
        user.save(using=self._db)
        user.notificationoptout_set.create(notification_type=const.NOTIFICATION_TYPE_NEWSLETTER)

        if save:
            user.save()

        return user

class User(AbstractBaseUser, PermissionsMixin):
   # ...
   objects = UserManager()

考虑到表单无论如何都是用户创建的入口,自定义创建方法不是很好的设计吗?是否应该将所有的内务管理都转移到表单中,例如,转移到 save 方法中?类似于:

class UserCreationForm(forms.ModelForm):
#...
    def save(self, commit=True):
        user = super(TestUserCreationForm, self).save(commit=False)
        user.email = user.normalize_email(self.cleaned_data.get("email"))
        user.set_password(self.cleaned_data["password1"])
        user.notificationoptout_set.create(notification_type=const.NOTIFICATION_TYPE_NEWSLETTER)

        if commit:
            user.save()
        return user

谢谢

表单不是创建用户的唯一方式。 UserManager.create_user()方法在manage.py createsuperuser命令中使用。