2

我对 django 很陌生。我正在使用 django、mongoengine、django-social-auth 来构建身份验证系统并将用户配置文件存储在 mongodb 中。

我正在使用 django 提供的“自定义用户模型”机制,如下所示:

from mongoengine import *
from mongoengine.django.auth import User

class UserProfile(User):

    imageUrl = URLField()

    def __init__(self):
        User.__init__()

settings.py 包括('users' 是应用程序名称):

SOCIAL_AUTH_USER_MODEL = 'users.UserProfile'

当我执行“python manage.py runserver”时,出现以下错误:

social_auth.usersocialauth: 'user' has a relation with model users.UserProfile, which has either not been installed or is abstract.

当我将我的 UserProfile 类更改为从 models.Model 继承时,如下所示:

from mongoengine import *
from mongoengine.django.auth import User
from django.db import models

class UserProfile(models.Model):

    imageUrl = URLField()

    def __init__(self):
        User.__init__()

,运行“python manage.py runserver”启动开发服务器没有问题。

所以我想,自定义用户模型必须继承自models.Model。那么我应该如何解决从 mongoengine.django.auth.User 继承我的自定义用户模型。

4

1 回答 1

1

从我所见,您只需创建一个具有一对一关系的 UserProfile 即可从 django 构建 User 模型。所以这是不正确的:

 SOCIAL_AUTH_USER_MODEL = 'users.UserProfile'

您应该创建自己的用户模型。按照这个

例子:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin

class User(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(unique=True, max_length=45, db_index=True)
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    email = models.EmailField(unique=True)
    status = models.SmallIntegerField()
    activation_code = models.CharField(max_length=50, null=True, blank=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    updated_at = models.DateTimeField(auto_now=True)
    login_at = models.DateTimeField()

    def __unicode__(self):
        return self.username

    def get_fullname(self):
        return '%s %s' % (self.first_name, self.last_name)

    def get_shortname(self):
        return self.first_name

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']
于 2013-06-15T12:27:05.017 回答