2017-05-24 11 views
0

これは私のフォームです、私は親、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モデルに入れるべきでしょうか?

+0

私には良い解決策のようです。 – Pblove

+0

エラーが発生した場合、データベースをスクロールバックすることができます。 – kotepillar

+0

Djangoのトランザクションを使っていると正常に動作しているようです。 – Pblove

答えて

0

あなたは次に、あなただけの保存方法でそれを設定しないでください、あなたのstaffuserモデル

class StaffUser(User): 
    parent = models.ForeignKey(
     'users.User', 
     on_delete=models.CASCADE, 
     related_name='staff_childs', 
     null=True 
    ) 

を変更する必要があります。

def save(self, parent): 
    if parent: 
     self.instance.parent = parent 
+0

申し訳ありませんが、すべてのStaffUserが親になる必要があります。つまり、他のタイプのユーザーが親になる必要がない場合があります。たとえば、登録ページに自分自身を登録するなどです。今はNormalUser(User)のような別のユーザーモードですが、私はUserモデルに親を置かないことを意味します。 – kotepillar

+0

は、あなたがその – Pblove

+0

でそれを設定することはできませんので、あなたは、あなたのユーザモデルに親フィールドを持っていないええ、私はそうは思いますが、一部の人々は私に言う:StaffUserがあまりにも多くの余分な情報を持っていない場合、のすべてを置きますそれらのユーザーに、しかし私はそれが正しくないと思いますか? – kotepillar

関連する問題