Изменение ролей в приложении 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/

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