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