Django多个用户配置文件/子配置文件

时间:2011-09-05 22:44:13

标签: django

我正在尝试使用内部/外部用户特定的配置文件创建内部网/外部网,并使用通用的通用配置文件。我在这个网站上看了几个答案,但没有一个专门解决我想要做的事情。下面是我到目前为止的(精简版)文件。

创建配置文件模型的最佳方法是什么,每种用户类型都有子配置文件?我尽量不要求自定义身份验证后端。

https://gist.github.com/1196077

3 个答案:

答案 0 :(得分:9)

我有一个解决方案,我不知道它是否最好,但看到它:

models.py

from django.db import models
from django.contrib.auth.models import User

class Pollster(models.Model):
    """docstring for Polister"""
    user   = models.OneToOneField(User, related_name = 'polister', unique=True)
    cedule = models.CharField( max_length = 100 ) 

class Respondent(models.Model):
    """ """
    born_date   = models.DateField( verbose_name=u'fecha de nacimiento' )
    cedule      = models.CharField( max_length = 100, verbose_name=u'cedula' ) 
    comunity    = models.CharField( max_length = 100, verbose_name=u'comunidad')
    phone       = models.CharField( max_length = 50, verbose_name=u'telefono')
    sanrelation = models.TextField( verbose_name =u'Relacion con SAN')
    user        = models.OneToOneField( User, related_name = 'respondent')

我创建了一个MiddleWare:所以

我创建了middleware.py

from django.contrib.auth.models import User
from encuestas.models import Pollster, Respondent

class RequestMiddleWare(object):
    """docstring for """
    def process_request(self,request):
        if isPollster(request.user):
            request.user.userprofile = Pollster.objects.get( user = request.user.id)
        elif isRespondent(request.user):
            request.user.userprofile = Respondent.objects.get(user = request.user.id)   
        return None   

def isPollster(user):
    return Pollster.objects.filter(user=user.id).exists()

def isRespondent(user):
    return Respondent.objects.filter(user=user.id).exists()

您需要为中间件配置settings.py: 添加到MIDDLEWARE_CLASSES属性:

'encuestas.middleware.RequestMiddleWare'

encuestas是my_app名称 中间件是中间件文件 RequestMiddleWare是中间件类

答案 1 :(得分:4)

您需要结合使用存储有关usersmodel inheritance的其他信息。

基本上,您需要我们都知道的通用User模型,无论是爱还是恨,然后您需要一个属于AUTH_PROFILE_MODULE设置的通用配置文件模型。

该配置文件模型将是顶级模型,具有内部和外部用户的模型子类。您可能在这种情况下不需要抽象模型,因为您需要一个公共配置文件表来加载来自User.get_profile()的用户配置文件。

所以...我认为你要改变的主要事情是让你的Associate,External等模型继承你的Profile模型。

答案 2 :(得分:-1)

请查看这篇介绍如何从User类继承并添加自己的信息的优秀文章。对我来说,至少,这似乎是要走的路:http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

使用这种方法,应该可以轻松地将多种用户类型添加到他们的Django应用程序中。