Django: user.has_perm всегда возвращает false
У меня есть пользователь:
from django.contrib.auth.models import AbstractUser
# Create your models here.
class TaborUser(AbstractUser):
email = models.EmailField('E-mail', unique=True)
Its backend:
from django.contrib.auth.backends import BaseBackend
from django.contrib.auth import get_user_model
from django.db.models import Q
UserModel = get_user_model()
class EmailBackend(BaseBackend):
def get_user(self, user_id):
user = UserModel.objects.filter(pk=user_id)
breakpoint()
if user:
return user[0]
else:
return None
def authenticate(self, request, username=None, password=None, **kwargs):
user = UserModel.objects.filter(email=username)
if not user:
user = UserModel.objects.filter(username=username)
# Both username and e-mail are unique. As long as we don't have
# a very rogue admin, we should be alright.
if user:
user = user[0]
else:
return None
if user.check_password(password):
return user
else:
return None
Похоже, что модель не проходит эту проверку:
class AdminView(PermissionRequiredMixin, FormView):
form_class = UploadFileForm
template_name = "admin.html"
login_url = "/login/"
permission_required = ("taborapp.view_photomodel",
"taborapp.add_photomodel",
"taborapp.delete_photomodel",
)
Когда пользователь добавляется следующим образом:
from taborapp.models import TaborUser
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
user = TaborUser.objects.create_user("test")
user.email = "test@example.me"
user.set_password("LOLaPublicPassword123")
permissions = []
photo_type = ContentType.objects.get(app_label="taborapp", model="photomodel")
for codename in "view_photomodel", "add_photomodel", "delete_photomodel":
perm = Permission.objects.filter(content_type=photo_type, codename=codename)
permissions.append(perm[0])
user.user_permissions.add(*permissions)
user.save()
Я делаю что-то неправильно? Я несколько раз просмотрел документацию и аналогичные вопросы на stack overflow, и я просто не могу понять проблему.
Я слишком краток, чтобы система автоматического определения поверила мне, что я достаточно описал свою проблему. Я надеюсь, что это предложение удовлетворит ее.
Зайдите в оболочку Django:
python manage.py shell
Следующий,
from django.contrib.auth.models import User
u = User.objects.get(email="test@example.me")
u.get_user_permissions()
Надеемся, что в полученных данных вы увидите то, что ищете. Это даст вам хорошее представление о том, где искать дальше.
Как указал @RiverRook, получение списка разрешений было очень полезным, поскольку мне удалось найти нужную тему об этом.
Django user get_all_permissions() пуст, в то время как user_permissions установлен