Пользовательская модель пользователя - у объекта 'Group' нет атрибута 'user_set' - PullRequest
0 голосов
/ 21 апреля 2020

Я довольно новичок в 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'

my models.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

my 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, а вместо этого расширил PermissionsMixin в своем классе Account. Это позволило мне просматривать группы разрешений и указывать c группы для каждого пользователя, однако, когда они применяются, кажется, что никакого эффекта не происходит. У меня все еще есть тот же доступ, что и раньше. Чего мне не хватает?

1 Ответ

0 голосов
/ 21 апреля 2020

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)
...