Как программно подтвердить все установленные приложения в Django

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',

    # Local apps
    'users.apps.UsersConfig',

    # Third party apps
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
]

views.py


@user_passes_test(lambda u: u.is_superuser)
def create_group(request):
    groups = Group.objects.all()
    if request.method == 'POST':
        group_name = request.POST.get('group_name')
        group = Group.objects.create(name=group_name)
        return HttpResponse(group.name)
    else:
        ctx = {'groups': groups}
        return render(request, 'users/admin/create_group.html', ctx)

Здесь я создал представление для создания группы пользователей программным путем. Теперь я хочу разрешить пользователям одобрять разрешение так же, как панель управления django-admin. Например, выберите несколько разрешений, а затем нажмите кнопку отправки, чтобы добавить эти разрешения в выбранную группу. Должен быть какой-то способ сделать это, потому что сам администратор django делает это таким образом. Я хотел бы получить некоторые идеи, как я могу это сделать.


person Tareq Monwer    schedule 23.10.2020    source источник


Ответы (1)


Django реализует это сам с помощью ManyToManyField между Group< /strong> и Permission. Объект Permission использует поле content_type для ссылки на ContentType модель [Django-doc], в которой указаны все модели.

Таким образом, если вы хотите добавить разрешение с заданным codename в Group, вы можете использовать:

from django.contrib.auth.models import Permission

permission = Permission.odocumentenbjects.get(codename='add_mymodel')

mygroup.permissions.add(permission)

Или, если вы, например, хотите добавить все разрешения для данной модели Foo, вы можете использовать:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

permissions = Permission.objects.filter(
    content_type=ContentType.objects.get_for_model(Foo)
)

mygroup.permissions.add(*permissions)

Вы также можете создавать дополнительные разрешения так же, как вы создаете объекты для другой модели, и, конечно же, добавлять их в группу.

Вы также можете добавить все разрешения с помощью:

from django.contrib.auth.models import Permission

permissions = Permission.objects.all()

mygroup.permissions.add(*permissions)
person Willem Van Onsem    schedule 23.10.2020
comment
Привет, мне очень понравился подход. Но я хочу перечислить все доступные разрешения в проекте (не отдельные модели, а все модели в проекте), а затем добавить их в группу. Как получить все разрешения для всех установленных приложений? - person Tareq Monwer; 24.10.2020
comment
@TareqMonwer: вы используете Permission.objects.all(). - person Willem Van Onsem; 24.10.2020