关于在Django中创建自定义用户模型的指南

时间:2014-02-22 08:49:46

标签: python django facebook django-models oauth

我想使用facebook登录以及可选的电子邮件/密码登录/注册为时尚科技应用程序的用户创建注册。

我一直坚持如何完成这个过程(博客中有太多的例子告诉我矛盾的信息,而Django文档并没有很清楚地解释我的需要)。

所以我的问题是:

  1. 如何创建我的模型以显示用户能够通过自定义设计界面(由我)登录/注册,同时禁止他们登录管理员用户区域并成为超级用户,但允许我(管理员)查看和控制常规django管理区域中的超级用户用户。
  2. 我猜我必须首先从模型/逻辑开始,所以:

    这是我的models.py到目前为止,我已经为用户添加了字段,一旦正式登录,他们就可以从他们的个人资料中访问这些字段。但当然首先会要求他们使用他们的电子邮件,用户名和密码登录(如果选择密码/电子邮件登录或注册)。

    Models.py:

    from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
    from django.db import models
    
    #custom user model fro Users
    
    class MyUser(AbstractBaseUser):
        username = models.CharField(max_length=40, db_index=True)
        first_name = models.CharField(max_length=254, blank=True)
        last_name = models.CharField(max_length=254, blank=True)
        email = models.EmailField(max_length=254, null=False, unique=True, blank=True)
        birthday = models.DateField(null=True, blank=True)
        city = models.CharField(max_length=50, blank=True)
        state = models.CharField(max_length=50, blank=True)
    
    
    user_title = models.CharField(max_length=254, blank=True)
        user_points = models.IntegerField(null=False, blank=True)
        avatar = FileField()
    
        #admin level and additional infomation
        is_active = models.BooleanField(default=True)
        is_admin = models.BooleanField(default=False)
    
    
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['email', 'username']
    
    
    class MyUserManager(object):
        """Creates and saves a User with the given first_name, last_name, birthday,"""
        def create_user(self, email, username, first_name, last_name, birthday, city, state, use
    
    r_title, user_points, avatar, password=None):
        if not email:
            raise ValueError('Users must have an email address')
    
        user = self.model(
            email=MyUserManager.normalize_email(email),
            first_name=first_name,
            last_name=last_name,
            birthday=birthday,
            city=city
            state=state,
            user_title=user_title,
            user_points=user_points,
            avatar=avatar,
        )
    
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_superuser(self,  email, first_name, last_name, birthday, city, state, user_title, user_points, avatar, password):
    
    
    user = self.create_user(email,
            password=password,
            first_name=first_name,
            last_name=last_name,
            birthday=birthday,
            city=city
            state=state,
            user_title=user_title,
            user_points=user_points,
            avatar=avatar,
        )
    
    
        user = 
    

1 个答案:

答案 0 :(得分:2)

首先,您的自定义用户模型乍一看对我来说很好。

要将自定义模型与Django管理员正确集成,您应将is_admin字段替换为Django admin is_staffis_superuser使用的两个字段。有关详细信息see the documentation here。这将阻止非员工(非管理员)用户访问管理员,并允许您定义超级用户以授予完全访问权限。

编辑:发现更简单的方法,只是子类AbstractUser而不是AbstractBaseUser,这是详细的here。这是您的代码,修改并清除任何冗余字段(已在父类中实现)

class MyUser(AbstractUser):
    birthday = models.DateField(null=True, blank=True)
    city = models.CharField(max_length=50, blank=True)
    state = models.CharField(max_length=50, blank=True)

    user_title = models.CharField(max_length=254, blank=True)
    user_points = models.IntegerField(null=False, blank=True)
    avatar = models.FileField()

现在,要完成此过程,您只需要为您的网页撰写网址和视图,并在适当情况下使用@login_required装饰器,以防止"anonymous" users访问这些网页。

实现@login_required装饰器的示例视图:

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def user_profile(request):
    # render your template with the RequestContext
    return render('profile.html')