【问题标题】:Multiple User Profiles in django-userenadjango-userena 中的多个用户配置文件
【发布时间】:2012-05-28 03:16:29
【问题描述】:

我正在尝试为 Userena 创建多个配置文件 - 每个用户只能有一个配置文件类型。在其他讨论之后,我正在使用多表继承,但是当我这样做时,我无法将数据保存到派生模型中。一切最终都是 CommonProfile,这应该是不可能的/不允许的。示例代码如下:

models.py:

# models.py
# This is an example of how i've attempted to get 
# multiple user profiles working with Userena
from django.contrib.auth.models import User
from django.db import models
from userena.models import UserenaLanguageBaseProfile

class CommonProfile(UserenaLanguageBaseProfile):
    """Common fields for 2 user profiles: Spam and Eggs"""
    user = models.OneToOneField(User)
    common_field = models.CharField(max_length=100)

    @property
    def is_spam(self):
        """Find out if this is a Spam user"""
        try:
            self.spamprofile
            return True
        except SpamProfile.DoesNotExist:
            return False

    def get_real_type(self):
        """return the real model"""
        if self.is_spam:
            return self.spamprofile
        else:
            return self.eggsprofile

class SpamProfile(CommonProfile):
    spam_field = models.CharField(max_length=20)

class EggsField(CommonProfile):
    eggs_field = models.SmallIntegerField()

forms.py

# forms.py
# This is the form to sign up a Spam Type Person

from django import forms
from userena.forms import SignupFormTos
from . models import CommonProfile, SpamProfile

class SpamSignupForm(SignupFormTos):
    """signup a Spam Person"""
    common_field = forms.CharField(label='what is your quest')
    spam_field = forms.CharField(label='what kind of spam are you')

    def clean(self):
        cleaned_data = super(SpamSignupForm,self).clean()
        #do stuf, same idea for clean_<field>
        return cleaned_data

    def save(self):
        """Save the SpamProfile"""
        user = super(SpamSignupForm,self).save()
        common_profile = user.get_profile()
        spam_profile = SpamProfile(commonprofile_ptr=common_profile)
        spam_profile.spam_field = self.cleaned_data['spam_field']
        spam_profile.save()
        return spam_profile

【问题讨论】:

    标签: python django


    【解决方案1】:

    这个周末我也遇到了同样的问题。试试你的保存功能

    def save:
      #your other code
       spam_field = self.cleaned_data['spam_field']
       new_spam_user = SpamProfile.objects.create_user(spam_field)
    
       return new_user
    

    【讨论】:

    • 只是注释一下,SpamProfile作为CommonProfile和UserenaLanguageBaseProfile的直接继承者,没有objects.create_user,也就是说你需要为profile添加一个UserManager派生管理器。还是我在您的解决方案中遗漏了一些隐含的东西?
    • 是的,你需要一个经理。你可以在他们的 manager.py 文件中看到 userena 是如何实现它的
    猜你喜欢
    • 2013-06-30
    • 2011-10-12
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多