Изменение ролей в приложении django не изменяет разрешения
Я создаю приложение на django, где у меня есть 2 типа пользователей, "Создатели" и "Подписчики". Создатель" должен иметь доступ ко всем представлениям (добавление, изменение, просмотр ...), в то время как подписчик может только "просматривать" содержимое. Проблема в том, что когда я создаю подписчика в первый раз, он имеет только права подписчика, а когда я редактирую его роль с подписчика на создателя, он может иметь доступ к правам создателя, но когда я меняю роль с создателя на подписчика, я все еще имею права создателя, даже если текущий пользователь является подписчиком!
Models.py
class User(AbstractUser):
CREATOR = 'CREATOR'
SUBSCRIBER = 'SUBSCRIBER'
ROLE_CHOICES = (
(CREATOR, 'Créateur'),
(SUBSCRIBER, 'Abonné'),
)
profile_photo = models.ImageField(verbose_name='Photo de profil')
role = models.CharField(choices=ROLE_CHOICES, max_length=30, verbose_name='rôle')
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.role == self.CREATOR:
group = Group.objects.get(name='creators')
group.user_set.add(self)
elif self.role == self.SUBSCRIBER:
group = Group.objects.get(name='subscribers')
group.user_set.add(self)
views.py
def edit_profile(request):
form = forms.UpdateProfileForm(instance=request.user)
if request.method == 'POST':
form = forms.UpdateProfileForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('home')
return render(request, 'authentication/upload_profile_photo.html', {'form': form})
forms.py
class UpdateProfileForm(forms.ModelForm):
class Meta:
model = get_user_model()
fields = ['first_name', 'last_name', 'role']
Для использования ролей вам нужно расширить AbstractUser (для простого случая) в вашем models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
CREATORS = 1
SUBSCRIBERS = 2
ROLE_CHOICES = (
(CREATORS , 'Creators'),
(SUBSCRIBERS , 'Subscribers'),
)
role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, blank=True, null=True)
Разрешения - это правила (или ограничения) для просмотра, добавления, изменения, удаления (Django по умолчанию) или пользовательские правила для объектов для определенного пользователя или группы пользователей. Чтобы проверить, какие пользователи имеют базовые разрешения, а какие нет, вы можете использовать следующий код:
добавить: user.has_perm('YourAppName.add_vote')
изменение: user.has_perm('YourAppName.change_vote')
удалить: user.has_perm('YourAppName.delete_vote')
view: user.has_perm('YourAppName.view_vote')
Или используйте декоратор для проверки того, имеет ли пользователь разрешение на выполнение функции или нет.
@permission_required('YourAppName.add_vote')
def your_func(request):
"""or you can rise permission denied exception"""
Для проверки наличия у пользователя прав в шаблоне, синтаксис следующий
{% if perms.YourAppName.add_vote %}
надеюсь решить вашу проблему
источник:https://www.codeunderscored.com/django-roles-permissions-and-groups/