在 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
命令中使用。
我有一个非常简单的 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
命令中使用。