【问题标题】:Multiple User Profile with Django Userena使用 Django Userena 的多个用户配置文件
【发布时间】:2013-06-30 15:01:11
【问题描述】:

我正在使用 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

现在问题出在 save 方法中。
基于this answer,我尝试实现一个自定义管理器,但我没有运气(我是一个django 新手)。我理解的重点是Save 方法应该返回一个 Django 用户,而不是一个 userena 配置文件。

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

然后我尝试了类似this:

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() 方法将始终(我猜)返回 settings.AUTH_PROFILE_MODULE 中定义的基本配置文件。
在我看来,作者在 subprofile 中使用 profile 字段作为与 Baseprofile 的 OneToOne 关系同时实现 多表继承,为什么?这对我来说似乎不合适。

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

是的,基本上我已经花了一整天的时间试图弄清楚这一点,但我还是迷路了。

【问题讨论】:

    标签: django django-users django-profiles


    【解决方案1】:

    最好使用 django-registration。安装并添加到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
    

    在registration/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'),
    

    【讨论】:

    • 我实际上想使用 userena 来使用它的所有其他功能,这些功能需要我自己重写(用户帐户创建和编辑、面部照片、消息传递、其他用户的帐户可见性)。将这些混合 django-registration 与其他可重用应用程序实现的任何替代方法?
    • 实际上这些代码并没有内置在 django-registration 中。你最好不要使用 django-registraion。尝试执行这些代码,例如在 userena 中编辑 urls.py、views.py ..etc
    • 这正是我想要做的,但我陷入了在 userena 中创建多个配置文件的阶段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2012-03-27
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2023-03-29
    • 2012-05-09
    相关资源
    最近更新 更多