2016-07-12 52 views
0

我有一個Django應用程序,其中將有兩種類型的用戶註冊。 ConsumersProvidersDjango在用戶註冊時創建不同的用戶配置文件實例

class ConsumerProfile(models.Model): 
    user = models.OneToOneField(User) 
    # Some fields 


class ProviderProfile(models.Model): 
    user = models.OneToOneField(User) 
    # Some fields 


def create_user_profile(sender, instance, created, **kwargs): 
    if created: # What should the condition be here so that only the correct profile is created 
     ConsumerProfile.objects.create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

如何確保在創建用戶時只創建正確的配置文件模型實例?

+0

爲什麼不在函數中包含'kind = UserTypes.CONSUMER'參數或類似的東西? – camden

+0

@camdenb,我不確定那裏會放什麼。你能解釋一下嗎? – Newtt

+0

'UserTypes'不是必須的,因爲你總是可以傳遞一個字符串('kind =「Consumer」')給函數,前者不太容易出現拼寫錯誤。儘管如此,恐怕我不完全理解你的問題。你什麼時候會調用'create_user_profile'? – camden

回答

2

信號不是處理這個問題的正確方法。正確的方法是在您的註冊功能中添加此邏輯:

def sign_up(request): 
    form = SignupForm(request.POST or None, request.FILES or None) 
    if form.is_valid(): 
     user = User.objects.create_user(form.cleaned_data['usern_name'], 
             form.cleaned_data['email'], 
             form.cleaned_data['password']) 
     user.save() 
     if form.cleaned_data['user_type'] == 'consumer': 
     profile = ConsumerProfile() 
     profile.some_field = 'some_value' 
     if form.cleaned_data['user_type'] == 'provider': 
     profile = ProviderProfile() 
     profile.some_field = 'some_value' 
     if profile: 
     profile.user = user 
     profile.save() 
     user.save() 
+0

同意。在許多情況下使用信號可能是反模式。 – camden

0

您應該爲您的函數添加一個標誌,並使用它來確定您要創建的用戶的類型。使用if塊創建不同的配置文件。像這樣的:

def create_user_profile(sender, instance, created, consumerOrProvider, **kwargs): 
    if consumerOrProvider == ENUM_CONSUMER: 
     ConsumerProfile.objects.create(user=instance) 
    elif consumerOrProvider == ENUM_PROVIDER: 
     ProviderProfile.objects.create(user=instance) 

但是,爲什麼你想使用一個單一的功能呢?爲什麼不使用兩個功能併發送正確的請求?

+0

用戶本身是否知道它需要什麼樣的配置文件?您如何知道每個用戶需要哪種配置文件?如果用戶確實具有某種標誌來確定該標誌,則可以將其用於您的條件。 – Ariestinak

相關問題