Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django在用户注册时创建不同的用户配置文件实例_Django - Fatal编程技术网

Django在用户注册时创建不同的用户配置文件实例

Django在用户注册时创建不同的用户配置文件实例,django,Django,我有一个Django应用程序,其中有两种类型的用户注册。 消费者和提供者 class ConsumerProfile(models.Model): user = models.OneToOneField(User) # Some fields class ProviderProfile(models.Model): user = models.OneToOneField(User) # Some fields def create_user_profile

我有一个Django应用程序,其中有两种类型的用户注册。
消费者
提供者

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)

如何确保在创建用户时,只创建正确的配置文件模型实例?

您应该在函数中添加一个标志,并使用它来确定要创建的用户类型。使用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)

但是,为什么要使用单个函数来实现这一点呢?为什么不使用两个函数并发送正确的请求?

您应该在函数中添加一个标志,并使用它来确定要创建的用户类型。使用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)

但是,为什么要使用单个函数来实现这一点呢?为什么不使用两个功能并发送正确的请求?

信号不是正确的处理方法。正确的方法是在注册函数中添加此逻辑:

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()

信号不是正确的处理方法。正确的方法是在注册函数中添加此逻辑:

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()

为什么不在函数中包含一个
kind=UserTypes.CONSUMER
参数或类似的东西?@camdenb,我真的不确定该放在哪里。请您进一步解释一下好吗?
UserTypes
不是必需的,因为您总是可以将字符串(
kind=“Consumer”
)传递给函数,前者不太容易出现打字错误。不过,恐怕我不完全理解你的问题。你什么时候会调用
create\u user\u profile
?为什么不在函数中包含
kind=UserTypes.CONSUMER
参数或类似的东西?@camdenb,我不太确定它会放在哪里。请您进一步解释一下好吗?
UserTypes
不是必需的,因为您总是可以将字符串(
kind=“Consumer”
)传递给函数,前者不太容易出现打字错误。不过,恐怕我不完全理解你的问题。您将在何时调用
创建用户档案
?用户是否知道自己需要什么样的档案?您通常如何知道为每个用户查找哪种配置文件?如果用户确实有某种标志来确定,您可以将其用于您的If条件。用户自己知道它需要什么样的配置文件吗?您通常如何知道为每个用户查找哪种配置文件?若用户确实有某种标志来确定,那个么您可以将其用于If条件。