2017-05-24 27 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(用戶)也不需要父字段。我的意思是父母只屬於誰需要它,所以我應該把它放在用戶模型中,對吧?

+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(用戶)的用戶模式,我的意思是不要把父母放在用戶模型中。 – kotepillar

+0

您沒有在您的用戶模型中的父字段,所以你不能把它放在那 – Pblove

+0

是啊,我是這麼認爲的,但有些人告訴我:如果StaffUser沒有太多額外的信息,把所有的他們給用戶,但我認爲這是不對的,是嗎? – kotepillar