【问题标题】:Guidance on creating Custom User Models in Django在 Django 中创建自定义用户模型的指南
【发布时间】:2014-03-24 00:06:38
【问题描述】:

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

我被困在如何完成这个过程上(博客中太多的例子告诉我相互矛盾的信息,而 Django 文档没有非常清楚地解释我需要什么)。

所以我的问题是:

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

我猜我必须先从模型/逻辑开始,所以:

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

模型.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 = 
    

【问题讨论】:

  • 不要创建自己的用户模型,创建用户配置文件并将 OneToOneField 与 django User 对象一起使用。然后一切都会开箱即用。

标签: python django facebook django-models oauth


【解决方案1】:

首先,您的自定义用户模型第一眼看起来不错。

要将自定义模型与 Django 管理员正确集成,您应该将 is_admin 字段替换为 Django 管理员 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()

现在,要完成该过程,您只需编写页面的 url 和视图,并在适当的地方使用 @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')

【讨论】:

  • 您能否通过代码示例对此进行扩展?提前谢谢!
  • 我添加了一些代码示例以及创建具有管理员访问权限的自定义用户模型的更简单方法。如果您需要其他杂项的帮助。 Django怎么做,请关注django's tutorials
猜你喜欢
  • 2019-10-17
  • 2013-03-30
  • 2013-10-30
  • 2018-06-11
  • 1970-01-01
  • 2013-12-23
  • 2020-08-22
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多