これは私のフォームです、私は親、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(User)も親フィールドは必要ありません。私は親がそれを必要とする人だけに属しているということを意味しているので、私はそれをUserモデルに入れるべきでしょうか?
私には良い解決策のようです。 – Pblove
エラーが発生した場合、データベースをスクロールバックすることができます。 – kotepillar
Djangoのトランザクションを使っていると正常に動作しているようです。 – Pblove