Permission_required для пользователей, которые только входят в группу, в классе, основанном на представлении

По учебнику, у меня есть представление с ограничением на отображение данных, основанное на разрешении формы "book.can_view" в классе BookDetailView

Это работает, но проблема в том, что каждый пользователь не имеет доступа к просмотру Я хотел бы сделать то же самое, но используя имя группы. Я хочу, чтобы только пользователи, входящие в группу с именем "premium", имели доступ к этой странице

my views.py

from django.shortcuts import render
from django.contrib.auth.mixins import PermissionRequiredMixin

from django.http import HttpResponse

from catalog.models import Book, Author, BookInstance, Genre
from accounts.models import CustomUser

from django.views.generic import ListView, DetailView


class BookListView(ListView):
    model = Book
    paginate_by = 10
    #permission_required = 'catalog.view_book'


def index(request):    

    # Generate counts of some of the main objects
    num_books = Book.objects.all().count()
    num_instances = BookInstance.objects.all().count()

    # Available books (status = 'a')
    num_instances_available = BookInstance.objects.filter(
        status__exact='a').count()

    # The 'all()' is implied by default.
    num_authors = Author.objects.count()

    context = {
        'num_books': num_books,
        'num_instances': num_instances,
        'num_instances_available': num_instances_available,
        'num_authors': num_authors,

    }

    # Render the HTML template index.html with the data in the context variable
    return render(request, 'index.html', context=context)


class BookDetailView(PermissionRequiredMixin, DetailView):
    """Generic class-based detail view for a book."""
    model = Book
    template_name = "catalog/permission_required.html"
    permission_required = 'book.can_view'# change this line ?


class AuthorListView(ListView):
    """Generic class-based list view for a list of authors."""
    model = Author
    paginate_by = 10


class AuthorDetailView(DetailView):
    """Generic class-based detail view for an author."""
    model = Author

спасибо за помощь

Я вижу это более или менее так.

from django.contrib.auth.mixins import UserPassesTestMixin
from django.contrib.auth.models import Group

class BookDetailView(UserPassesTestMixin, LoginRequiredMixin, DetailView):
    model = Book
    template_name = "catalog/permission_required.html"

    def test_func(self):
        premium_group = Group.objects.filter(name = "premium") # or get
        if self.request.user in premium_group:
            return True
        else:
            return False

Спасибо ttt, код, который вы мне сказали

def test_func(self):
        premium_group = Group.objects.filter(name = "premium") # or get
        if self.request.user in premium_group:
            return True
        else:
            return False

ограничивает доступ всем пользователям, и у меня есть страница 403, даже тот, кто имеет право на группу "премиум" и даже админ, это отправляет вас на страницу ошибки. Возможно, я забыл упомянуть, что я использую пользовательского пользователя, вот код модели

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models


class CustomUserManager(BaseUserManager):
    def create_user(self, email, password):
        if not email:
            raise ValueError('Vous devez entrer une adresse email.')
        email = self.normalize_email(email)
        user = self.model(email=email)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password):
        user = self.create_user(email=email, password=password)
        user.is_staff = True
        user.is_admin = True
        user.save()
        return user


class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        max_length=255,
        unique=True,
        blank=False
    )
    nom = models.CharField(max_length=50, blank=False, unique=True)

    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = "email"

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"

        return True

    def __str__(self):
        return self.email

Я протестировал этот другой код

def test_func(self):
        ok = Group.objects.all()
        if self.request.user.has_perm('premium'):
            return ok
        return ok.filter(user=self.request.user)

на этот раз он показывает мне правильную страницу ошибки, но даже пользователи, имеющие права группы, направляются на страницу ошибки

Вернуться на верх