您应该改为从 Django User 模型扩展并添加您需要的额外字段:
from django.contrib.auth.models import User as Auth_User
class User(Auth_User):
# add your extra fields here like roles, etc
phone = CharField(max_length=20, null=True, blank=True)
# add your extra functions
def extra_user_function(self):
return "This is an extra function"
这样你就有了自己的字段和 Django 用户字段...
迁移后,如果您检查数据库,您将拥有 auth_user 和 your_app_user 表。
请记住 request.user 只会给你超级字段......为了获得你需要的扩展类
User.objects.get(id=request.user.id)
如果您不自己添加任何 auth_user,那么最新的将只有额外的字段,并且 它的 id 将与 auth.User 相同 。
注意:这很重要!
否则 request.user.id 和 your_app.User.id 不匹配,因此 User.objects.get(id=request.user.id) 获胜'不起作用,您必须查询数据库才能找到 your_app.User.id
User.object.get(user_ptr_id = request.user.id)
其他需要考虑的事项
这将起作用:
# you_app.User objects gets vars from auth.User
user = User.objects.get(id=request.user.id)
first_name = user.first_name
但这行不通
# auth.User trying to get a function from your_app.User
user = request.user
user.extra_user_function()
所以用户模型可能是这样的:
import os
from django.contrib.auth.models import User as Django_User
from django.db.models import CharField, ImageField
class User(Django_User):
phone = CharField(max_length=20, null=True, blank=True)
observations = CharField(max_length=2048, null=True, blank=True)
picture = ImageField(upload_to='users', default='default/avatar.jpg')
class Meta:
# adding extra permissions (default are: add_user, change_user, delete_user)
permissions = (
("access_user_list", "Can access user list"),
("access_user", "Can access user"),
)
ordering = ["-is_staff", "first_name"]
Django 已经有组,而不是在用户上创建角色,所以你应该使用它们。
各组遵循相同的逻辑:
from django.contrib.auth.models import Group as Auth_Group
from django.db import models
class Group(Auth_Group):
observations = models.CharField(max_length=2048, null=True, blank=True)
def get_users_in_group(self):
return self.user_set.filter(is_active=1).order_by('first_name', 'last_name')
def count_users_in_group(self):
return self.user_set.count()
def __unicode__(self):
return self.name
class Meta:
permissions = (
("access_group_list", "Can access group list"),
("access_group", "Can access group"),
)
ordering = ["name"]
您可以清除/添加用户到组:
user.groups.clear()
user.groups.add(group)
清除/添加组权限:
group.permissions.clear()
group.permissions.add(permission)
还有一个装饰器来检查用户是否有权限
from django.contrib.auth.decorators import permission_required
@permission_required(("users.change_user","users.access_user",))
def your_view(request):
...
我过去尝试过很多事情,但我想这是要走的路。
如果您确实需要角色,并且用户可以拥有多个角色,那么最好的办法是创建一个模型角色并将其添加到具有 ManyToMany 字段的用户
roles = ManyToManyField(Role)
但你可以通过组来做到这一点