這是我的形式,我覺得把父母,USER_TYPE,發送電子郵件的所有形式的保存是不錯的選擇,你有更多更好的解決方案?告訴我原因。用戶類型,父母,發送所有形式更好?
class UserType(models.Model):
name = models.CharField(max_length=200, choices=settings.USER_TYPES, unique=True)
@classmethod
def get_type(cls, user_type):
# avoided fat finger, right? predefine the user type
return UserType.objects.get_or_create(name=user_type)[0]
class User(AbstractBaseUser, PermissionsMixin):
objects = UserManager()
user_id = models.AutoField(primary_key=True)
uuid = models.UUIDField(u"UUID", default=uuid.uuid1, unique=True, editable=False)
email = models.CharField(u'Email', max_length=30, unique=True, null=True,
validators=[
validators.RegexValidator(r'[^@][email protected][^@]+\.[^@]+', u'email format error')
])
perms = ArrayField(models.CharField(max_length=200, choices=settings.PERMS), blank=True)
user_type = models.ForeignKey(
'users.UserType',
on_delete=models.CASCADE,
related_name='users',
)
class StaffUser(User):
parent = models.ForeignKey(
'users.User',
on_delete=models.CASCADE,
related_name='staff_childs',
)
class StaffForm(forms.ModelForm):
class Meta:
model = StaffUser
fields = ['name', 'email', 'perms']
def __init__(self, *args, **kwargs):
## if you use CreateView, you can use get_form_kwargs pass extra paramter
self.parent = kwargs.pop('parent')
return super(StaffForm, self).__init__(*args, **kwargs)
def save(self):
self.instance.parent = self.parent
self.instance.user_type = UserType.get_type(settings.STAFF)
user = super(StaffForm, self).save()
# send email
return user
更新
class StaffCreateView(CreateView):
def get_form_kwargs(self):
kwargs = super(StaffCreateView, self).get_form_kwargs()
kwargs.update({'parent': self.request.user})
return kwargs
而且,還有另一個問題,我應該只是讓投入誰需要家長用戶父字段,而不是像這樣:父=用戶(空=真)。因爲不是每個用戶都需要父母。如果您在註冊頁面註冊自己,則不需要父字段,並且您的模型NormalUser(用戶)也不需要父字段。我的意思是父母只屬於誰需要它,所以我應該把它放在用戶模型中,對吧?
看起來像一個很好的解決方案給我。 – Pblove
謝謝,我發送郵件保存成功後,因爲如果發生任何錯誤,我可以回滾數據庫。 – kotepillar
是啊,這似乎完全正常使用Django交易 – Pblove