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)
на этот раз он показывает мне правильную страницу ошибки, но даже пользователи, имеющие права группы, направляются на страницу ошибки