Django 1.11 - сделать весь сайт доступным только для чтения для пользователей из данной группы (желательно с привязкой) - PullRequest
0 голосов
/ 10 апреля 2019

Мой вопрос не совпадает с Разрешения на просмотр в Django , потому что он объясняет, как бороться с проблемой в Django 2.1 и более поздних версиях, которая имеет концепцию разрешения "просматривать", пока я работаю с Django1.1.что нет.

Django 1.11

У меня есть группа пользователей, которая должна иметь доступ только для чтения ко всему на сайте.Нет ограничений на поля, модели и дополнительные данные, только то, что они могут с ним делать (только для чтения).Я знаю о возможных реализациях, которые предлагают сделать это «поле за полем» (или «сделать все поля доступными только для чтения») и решение «модель за моделью».Мне любопытно, если есть способ сделать это чище, на уровне группы пользователей или, по крайней мере, на уровне пользователя.

Мой пока views.py по умолчанию:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required 
def index(request):
    """View function for home page of site."""


    # Render the HTML template index.html with the data in the context variable
    return render(request, 'home.html')

В идеалеЯ хотел бы быть в состоянии сделать это с помощью приспособления.В настоящее время в этом приборе мои группы определены так:

{
    "model": "auth.group",
    "fields": {
        "name": "some_group",
        "permissions": [
            [
                "add_somemodel",
                "myproject",
                "somemodel"
            ],
            [
                "change_somemodel",
                "myproject",
                "somemodel"
            ],
            [
                "delete_somemodel",
                "myproject",
                "somemodel"
            ]

         ]
       }
}

В Django 2.2 я могу сделать

{
    "model": "auth.group",
    "fields": {
        "name": "some_group",
        "permissions": [
            [
                "view_somemodel",
                "myproject",
                "somemodel"
            ]  
         ]
       }
}

, но в Django 1.11 у меня есть только «добавить», «удалить»"и" изменить "- нет опции" просмотр "(в соответствии с документами введите описание ссылки здесь ).Итак, есть ли способ создать прибор, который создает группу, которая имеет только права на чтение для всего?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Спасибо всем за отклик.Я не придумал, как это сделать, используя только конфигурацию user / group / permissions в db с Django 1.11, возможно, он не существует.Вот что я закончил (очень похоже на первое предложение, которое я применил к SO, когда я начал исследование 4 часа назад, с минимальными изменениями кода)

  1. Создайте приспособление для моей новой группы, которое содержиттолько разрешение «change_somemodel» и создание пользователя в качестве члена этой группы, т.е. никаких записей «add_somemodel» и «delete_somemodel» и загрузка его в БД:
[
    {
        "model": "auth.group",
        "fields": {
            "name": "<my_new_group>",
            "permissions": [
                [
                    "change_<somemodel1>",
                    "<myproject>",
                    "<somemodel1>"
                ],

                [
                    "change_<somemodel2>",
                    "<myproject>",
                    "<somemodel2>"
                ]
             ]
    }
,
    {
    "model": "auth.user",
    "fields": {
        "password": "<my_password>",
        "last_login": null,
        "is_superuser": false,
        "username": "<my_username>",
        "first_name": "",
        "last_name": "",
        "email": "",
        "is_staff": true,
        "is_active": true,
        "date_joined": "2019-04-01T14:40:30.249Z",
        "groups": [
            [
                "<my_new_group>"
            ]
        ],
        "user_permissions": []
    }
}
],

Это позаботилось опервая часть: теперь, когда я вхожу в систему как этот пользователь, у меня нет кнопок «Добавить новый» или «Удалить» для любой модели моего пользователя.

Теперь, когда я загружаю вид для данного экземпляра некоторой модели, у меня все еще остаются редактируемые поля, и я по-прежнему вижу кнопки «Сохранить», «Сохранить и добавить еще» и «Сохранить и продолжить».Чтобы позаботиться об этом, в admin.py в суперклассе, из которого подклассы всех моих моделей, в его пользовательском def changeform_view я добавил:
if request.user.groups.filter(name='<my_new_group>'): 
   extra_context['show_save_and_add_another'] = False
   extra_context['show_save_and_continue'] = False
   extra_context['show_save'] = False

Это сделало эти 3 кнопки «Сохранить»исчезнуть для всех моделей и сделать все поля доступными только для чтения.Теперь этот новый пользователь не может добавлять, удалять или редактировать что-либо для любой модели, но он может видеть все так, как я хотел.

Похоже, в более новом Django, начиная с 2.1, это можно сделать еще лучше.

0 голосов
/ 10 апреля 2019

По вашему мнению, вам нужно что-то вроде этого (обратите внимание, что это пример того, как просмотреть сообщение, если вы принадлежите к соответствующей группе доступа):

def post_detail(request, slug=None):
    if not request.user.is_staff or not request.user.is_superuser:
        raise Http404
    instance = get_object_or_404(Post, slug=slug)
    share_string = quote_plus(instance.content)
    context = {
        "title": instance.title,
        "instance": instance,
        "share_string": share_string,
    }
    return render(request, "post_detail.html", context)

Обратите внимание на:

if not request.user.is_staff or not request.user.is_superuser:
        raise Http404

Вот несколько ссылок на документы, которые помогут вам:

Как аутентифицировать пользователей

Все атрибуты django.contrib.auth

Редактировать: я видел ваш код сейчас, поэтому то, что вы хотите достичь, может быть сделано следующим образом

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required 
def index(request):
    """View function for home page of site."""
    # With that way although a user might be logged in
    # but the user might not have access to see the page
    if not request.user.is_staff or not request.user.is_superuser:
        raise Http404


    # Render the HTML template index.html with the data in the context variable
    return render(request, 'home.html')

Таким образом, пользователь может войти в систему, но если этоне сотрудник или суперпользователь, который хочет иметь доступ к странице.

...