Многопользовательский профиль с 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'),