django创建多个类型用户的最佳方法

gam*_*mer 18 python django

我想在django中创建多个用户.我想知道哪种方法最好..

class Teachers(models.Model):
    user = models.ForeignKey(User)
    is_teacher = models.BooleanField(default=True)
    .......
Run Code Online (Sandbox Code Playgroud)

或者我应该使用..

class Teacher(User):
    is_teacher = models.BooleanField(default=True)
    .......
Run Code Online (Sandbox Code Playgroud)

或者我必须制作自定义用户模型...这对于创建多个类型的用户来说会很好......

Bur*_*lid 26

Django没有多个用户 - 它只有一个用户,然后根据权限用户可以做不同的事情.

所以,从一开始 - 在django中只有一个用户类型.如果您使用默认的认证框架,这个用户的模式被称为Userdjango.contrib.auth.models.

如果要在django中自定义用户行为,可以执行以下三项操作:

  1. 自定义验证方式.默认情况下,使用存储密码的数据库进行身份验证.您可以针对facebook/google等进行身份验证或针对现有用户数据库进行身份验证 - 例如,如果您使用的是Windows网络,则使用ActiveDirectory.

  2. 创建自定义权限,并根据这些权限限制用户可以执行的功能.默认情况下,在每个模型上 - django将添加基本权限"可以编辑","可以删除","可以读取".您可以创建自己的,然后检查用户是否具有这些特定权限.

  3. 您可以存储有关用户的额外信息,以及django通常存储的内容.有两种方法可以执行此操作,具体取决于您需要多少自定义.如果django默认提供的所有内容都适合您,而您想要做的就是存储有关用户的额外信息,您可以扩展用户模型 - 在以前的版本中,这称为创建自定义配置文件.如果您想要更深入的自定义,您拥有的另一个选择是创建自己的User模型.自定义用户模型的最常见用途是,如果要使用电子邮件地址作为用户名.

您不必全部三个,事实上有时您只想存储一些额外信息或使用他们的电子邮件地址进行身份验证; 在某些应用程序中,您必须修改所有三个位置.

在您的情况下,由于您要做的只是存储有关用户的额外信息,您需要通过创建引用的模型来扩展用户模型User(注意:您不从中继承User):

class Profile(models.Model):
    user = models.OneToOneField(User)
    department = models.CharField(max_length=200, default='Computer Science')
    is_teacher = models.BooleanField(default=False)
    is_student = models.BooleanField(default=True)
    # .. etc. etc.
Run Code Online (Sandbox Code Playgroud)

  • 如果我想为老师和学生提供不同的领域怎么办...我想为不同领域的老师和学生创建不同的模型.只有一些领域是常见的,他们应该注册不同的注册表格一个用于教师,另一个用于学生. (2认同)
  • 您无需创建不同的模型,只需创建一个模型,然后以用于注册用户的形式显示与他们相关的字段即可。不要创建代表您的用户的多个模型,这会在以后产生问题。 (2认同)

Nil*_*ner 6

我在Django 1.7(也可以在1.6上使用)中遵循的一种方法是子类化 AbstractUser

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

class User(AbstractUser):
    balance = models.DecimalField(default=0.0, decimal_places=2, max_digits=5)
Run Code Online (Sandbox Code Playgroud)

要使用您的模型,您需要将其设置为用于身份验证的模型settings.py

AUTH_USER_MODEL = 'your_app.User'
Run Code Online (Sandbox Code Playgroud)

还要注意,现在必须在模型中的关系中settings.AUTH_USER_MODEL引用新User模型时使用。

from django.db import models
from django.conf import settings

class Transaction(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL) # ForeignKey(User) will not work
Run Code Online (Sandbox Code Playgroud)