Многопользовательский профиль с Django Userena

Я использую userena 1.2 и Django 1.4. Я пытаюсь создать несколько пользовательских профилей, но мне не повезло, после многих постов, найденных здесь на SO.

Я создал 2 пользовательских модели и форму примерно так:

class BaseProfile(UserenaBaseProfile):
    """ Default profile """
    user = models.OneToOneField(User, unique=True, verbose_name = _('user'), related_name='base_profile')

    @property # accessing a method as a property
    def is_seller(self):
        """Find out if this is a Seller user"""
        try:
            self.seller
            return True
        except Seller.DoesNotExist:
            return False

    def get_profile_type(self):
        """return the profile type model"""
        if self.is_seller:
            return self.seller
        else:
            return self.customer


class Seller(BaseProfile):
    company = models.CharField(_('Company'),max_length=100, null=True, blank=True,)


class Customer(BaseProfile):
    favourite_snack = models.CharField( _('favourite snack'), max_length=5 )

И переопределить форму регистрации:

class SignupFormExtra(SignupForm):
    # stuff in here
    def save(self):
        # stuff in here

Теперь проблема в методе сохранения.
Основываясь на этом ответе, я попытался реализовать собственный менеджер, но мне не повезло (я новичок в Django). Важным моментом, который я понял, является то, что Save Метод должен вернуть пользователя Django, а не профиль пользователя userena.

def save(self):
    user = super(SpamSignupForm,self).save()
    new_customer = Customer.objects.create_user()
    return new_user

Тогда я попробовал что-то вроде этого:

def save(self):
    new_user = super(SignupFormExtra, self).save()
    new_user.save()
    customer = Customer(profile = new_user.get_profile(), user=new_user)
    customer.save()
    return new_user

get_profile() Метод всегда (я предполагаю) возвращает базовый профиль, определенный в настройках.AUTH_PROFILE_MODULE.
Также мне кажется неправильным, что автор использовал profile поле в субпрофиле как отношение OneToOne к базовому профилю WHILE, реализующее наследование нескольких таблиц, почему? Это не кажется мне правильным.

class Customer(Baseprofile):
    profile = models.OneToOneField(Baseprofile,
                            unique=True,
                            verbose_name=_('profile'),
                            related_name='student')

Да, в основном я провел целый день, пытаясь понять это, и я все еще потерян.

1 ответ

Лучше использовать django-регистрацию. установить и добавить его в INSTALLED_APPS =(.....'registration',

Теперь создайте два пользователя в

регистрация /models.py

.................

class Seller(models.Model):
    user=models.OneToOneField(User)
    companyname= models.CharField(max_length=100,blank=True)

    def __unicode__(self):
        return self.user.username

class Customer(models.Model):
    user=models.OneToOneField(User)
    birth_date = models.DateField(null=True, blank=True)
    favourite_snack = models.CharField(max_length=5)
    def __unicode__(self):
        return self.user.username

в регистрации /views.py

........
from django.contrib.auth import authenticate, login
from registration.models import Seller,Customer
from django.http import HttpResponse
def auth_login(request,utype):
    temp_login='registration/%slogin.html' %utype
    try:
        username = request.POST['username']
        password = request.POST['password']        
    except KeyError:
        return render(request,temp_login)
    user = authenticate(username=username, password=password)
    if utype=='seller':
        try:Seller.objects.get(user=user)
        except: return render(request,temp_login,{'errors':True})
    if utype=='customer':
        try:Customer.objects.get(user=user)
        except: return render(request,temp_login,{'errors':True})    
    if user.is_active:
        login(request,user)
        return HttpResponseRedirect('/'+request.GET['next'])#,render(request,'%s/home.html' %utype)
    return render(request,temp_login,{'errors':True})

изменить регистрацию /auth_urls.py

urlpatterns = patterns('',
                       url(r'^login/(employer|jobseeker)/$',
                           auth_login,name='auth_login'),

регистрация / бэкэнды / по умолчанию /views.py

внутри class RegistrationView(BaseRegistrationView):

внутри def register(self, request, **cleaned_data): добавлять

if self.args[0]=='e': usertype=Seller()
        else: usertype=Customer()        
        usertype.user=new_user
        usertype.save()

регистрация / бэкэнды / по умолчанию / urls.py

добавить эти строки

url(r'^register/([ej])/$',
                           RegistrationView.as_view(),
                           name='registration_register'),
Другие вопросы по тегам