Django在用户注册时创建不同的用户配置文件实例
我有一个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
消费者
和提供者
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条件。