python - 自定义用户模型 - 'Group' 对象没有属性 'user_set'
问题描述
我对 Django 相当陌生,并设置了一个带有令牌身份验证的自定义用户模型。现在我正在尝试添加从后端将用户添加到用户组以指定权限的可能性。但是,我似乎无法克服这个错误。我正在使用 Python 3.7 和 Django 2.2.6。感谢你的帮助!
错误:
File "/Users/.../Dev/.../account/models.py", line 114, in save_m2m
self.instance.user_set.set(self.cleaned_data['users'])
AttributeError: 'Group' object has no attribute 'user_set'
我的模型.py:
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django import forms
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.auth.models import Group
class MyAccountManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError("Users must have an email address")
if not username:
raise ValueError("Users must have a username")
user = self.model(
email=self.normalize_email(email),
username=username,
)
group = Group.objects.all()
user.groups.add(group)
# group.user_set.add(user)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name='email', max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
date_joined = models.DateTimeField(
verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
plan_choices = [("P", "Pro"), ("B", "Basic"),
("F", "Free"), ("S", "Staff"), ("A", "Admin")]
plan = models.CharField(choices=plan_choices, default="F", max_length=1)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = MyAccountManager()
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
# if new user is registered to the server, a new token is generated
Token.objects.create(user=instance)
User = get_user_model()
# Create ModelForm based on the Group model.
# class GroupAdminForm(forms.ModelForm):
# class Meta:
# model = Group
# exclude = []
# Add the users field.
# users = forms.ModelMultipleChoiceField(
# queryset=User.objects.all(),
# required=False,
# widget=FilteredSelectMultiple('users', False)
# )
# def __init__(self, *args, **kwargs):
# super(GroupAdminForm, self).__init__(*args, **kwargs)
# if self.instance.pk:
# self.fields['users'].initial = self.instance.user_set.all()
# def save_m2m(self):
# self.instance.user_set.set(self.cleaned_data['users'])
# def save(self, *args, **kwargs):
# instance = super(GroupAdminForm, self).save()
# self.save_m2m()
# return instance
我的 admin.py:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from account.models import Account
from django.contrib.auth.models import Group
# from .models import GroupAdminForm
class AccountAdmin(UserAdmin):
list_display = ('email', 'username', 'date_joined',
'last_login', 'is_admin', 'is_staff', 'plan')
search_fields = ('email', 'username')
readonly_fields = ('date_joined', 'last_login')
filter_horizontal = ()
list_filter = ()
fieldsets = ()
admin.site.register(Account, AccountAdmin)
# Unregister the original Group admin.
# admin.site.unregister(Group)
# class GroupAdmin(admin.ModelAdmin):
# form = GroupAdminForm
# filter_horizontal = ['permissions']
# admin.site.register(Group, GroupAdmin)
更新
我调整了代码以不再覆盖 Group 类,而是在我的 Account 类中扩展 PermissionsMixin。这使我可以查看每个用户的权限组和特定组,但是当应用这些时,似乎根本没有效果。我仍然拥有与以前相同的访问权限。我错过了什么?
解决方案
group = Group.objects.all()
是一个查询集。user_set
可以从Group
实例中访问。
另外,add the possibility of adding users to user groups from the backend
- 你不需要这样做。创建用户后,您始终可以通过以下方式将用户添加到特定组:
groups = Group.objects.filter(...) # get groups you want to add the user to
user.groups.add(*groups)
推荐阅读
- android - ARCore Pose 和 Aruco 估计PoseSingleMarkers
- css - 有没有办法验证某些 CSS 文件是否是从某个 LESS 文件编译的?
- java - 如何配置 OpenTracing Tracer 以在 Java 中将数据推送到 Prometheus/Grafana
- r - 如何插入另一列的值?
- angular - Bing Map V8 读取 GeoJson 查找质心并添加图钉
- algorithm - 计算子序列、子集和子字符串的正确方法是什么?
- javascript - 有没有办法让文件管理器 API 端点 JSON 响应?
- jquery - 如何从公共站点报告部分获取 .xml/.csv 报告
- javascript - 使用带有表单的反应 HOC。使用 HOC 传递通用 JSX 和状态
- stanford-nlp - 如何“调试”StanfordNLP 文本分类器