2012-05-28 2 views
4

Userena에 대해 여러 프로필을 만들려고합니다. 각 사용자는 하나의 프로필 유형 만 가질 수 있습니다. 다른 토론 후에는 다중 테이블 상속을 사용하지만이 작업을 수행하면 파생 된 모델에 데이터를 저장할 수 없습니다. 모든 것이 CommonProfile이되어 결국 허용되거나 허용되어서는 안됩니다. 예제 코드는 다음과 같습니다django-userena에서 여러 사용자 프로필

# 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 
# 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 

답변

1

forms.py에서 내가 같은 문제가 이번 주말을했다 :

models.py에. 프로파일에 대한 UserManager 파생 관리자를 추가 할 필요가 의미 objects.create_user을 가지고 있지 않으며, 당신의 저장 기능

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

    return new_user 
+0

CommonProfile 및 UserenaLanguageBaseProfile의 직접적인 후계자로 그냥 주석, SpamProfile에보십시오. 아니면 솔루션에 함축 된 무언가를 놓치고 있습니까? – yarbelk

+0

예 관리자가 필요합니다. userena가 자신의 managers.py 파일에서 어떻게 구현하는지 볼 수 있습니다 –