de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 juliomalegria
juliomalegria
Вопрос

Целая модель как только для чтения

Есть ли способ создать модель только для чтения в администраторе django? но я имею в виду всю модель. Итак, не добавляйте, не удаляете, не меняете, просто видите объекты и поля, все как только для чтения?

14 2011-10-27T18:13:15+00:00 5
Программирование
django
django-models
readonly
django-admin
Danny W. Adair
1-го ноября 2011 в 10:32
2011-11-01T10:32:33+00:00
Дополнительно
Источник
Редактировать
#56791319

ModelAdmin предоставляет hook get_readonly_fields () - следующее непроверено, моя идея состоит в том, чтобы определить все поля, как это делает ModelAdmin, без использования рекурсии с самими полями readonly:

from django.contrib.admin.util import flatten_fieldsets

class ReadOnlyAdmin(ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if self.declared_fieldsets:
            fields = flatten_fieldsets(self.declared_fieldsets)
        else:
            form = self.get_formset(request, obj).form
            fields = form.base_fields.keys()
        return fields

затем подкласс/mixin этого администратора, если он должен быть администратором только для чтения.

Для добавления/удаления и исчезновения их кнопок вы, вероятно, также захотите добавить

    def has_add_permission(self, request):
        # Nobody is allowed to add
        return False
    def has_delete_permission(self, request, obj=None):
        # Nobody is allowed to delete
        return False

P.S .: В ModelAdmin, если has_change_permission (lookup или ваше переопределение) возвращает False, вы не попадаете в представление изменения объекта - и ссылка на него даже не будет показана. Было бы здорово, если бы это произошло, и по умолчанию get_readonly_fields () проверил разрешение на изменение и в этом случае установил все поля только для чтения, как указано выше. Таким образом, не-чейнджеры могли бы, по крайней мере, просматривать данные ... учитывая, что текущая структура администратора предполагает view = edit, как указывает jathanism, это, вероятно, потребует введения разрешения «view» поверх добавления/изменения/удаления ...

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

readonly_fields = MyModel._meta.get_all_field_names()

EDIT: Вот еще один

if self.declared_fieldsets:
    return flatten_fieldsets(self.declared_fieldsets)
else:
    return list(set(
        [field.name for field in self.opts.local_fields] +
        [field.name for field in self.opts.local_many_to_many]
    ))
11
0
Peterino
24-го февраля 2017 в 7:02
2017-02-24T19:02:44+00:00
Дополнительно
Источник
Редактировать
#56791322

Как «разрешения просмотра» не попадет в Django 1.11 , к сожалению , вот решение, которое делает ваш ModelAdmin доступным только для чтения , делая как сохранение изменений модели, так и добавление записей журнала истории моделей no-op .

def false(*args, **kwargs):
    """A simple no-op function to make our changes below readable."""
    return False

class MyModelReadOnlyAdmin(admin.ModelAdmin):
    list_display = [
        # list your admin listview entries here (as usual) 
    ]
    readonly_fields = [
        # list your read-only fields here (as usual)
    ]

    actions = None
    has_add_permission = false
    has_delete_permission = false
    log_change = false
    message_user = false
    save_model = false

( ПРИМЕЧАНИЕ: Не ошибайтесь помощник false no-op с встроенным False . Если вы не сочувствуете вспомогательной функции вне класс переместит его в класс, назовите его no_op или что-то еще или переопределите затронутые атрибуты обычным def s. Меньше DRY, но если вам все равно. ..)

Это будет:

  1. удалить раскрывающийся список действий (с «удалить») в представлении списка
  2. запретить добавление новых записей модели
  3. запретить удаление существующих записей модели
  4. избегать создания записей журнала в истории модели
  5. избежать отображения «было успешно изменено» после сохранения
  6. избежать сохранения изменений в базе данных

Я не буду:

  • удалите или замените две кнопки «Сохранить и продолжить редактирование» и «СОХРАНИТЬ» (что было бы неплохо улучшить работу пользователя)

Обратите внимание, что get_all_field_names (как указано в принятом ответе) был удален в Django 1.10 . Протестировано с Django 1.10.5.

3
0
jathanism
27-го октября 2011 в 7:06
2011-10-27T19:06:45+00:00
Дополнительно
Источник
Редактировать
#56791318

Вы можете настроить классы ModelAdmin с помощью readonly_fields . Подробнее см. этот ответ .

2
0
PersianPattern.org
7-го февраля 2016 в 2:38
2016-02-07T14:38:03+00:00
Дополнительно
Источник
Редактировать
#56791321

Согласно моему тесту на Django 1.8, мы не можем использовать следующее, как указано в ответе № 3, но оно работает на Django 1.4 :

##     self.get_formset(request, obj)      ##
answer 3 needs fix. Generally, alternative codes for this issue about below section 
##          form = self.get_formset(request, obj).form    ##
##          fields = form.base_fields.keys()              ##

Может быть что-то вроде:

#~ (A) or
[f.name for f in self.model._meta.fields]

#~ (B) or
MyModel._meta.get_all_field_names()

#~ (C) 
list(set([field.name for field in self.opts.local_fields] +
                        [field.name for field in self.opts.local_many_to_many]         
  ))
1
0
nemesisfixx
11-го июня 2013 в 6:02
2013-06-11T18:02:05+00:00
Дополнительно
Источник
Редактировать
#56791320

У меня был аналогичный сценарий, где:

  1. Пользователь должен иметь возможность создавать объекты модели
  2. Пользователь должен иметь возможность просматривать список объектов модели
  3. Пользователь SHOULD'NT сможет редактировать объект после его создания.

1. Переопределение просмотра изменений

Поскольку в ModelAdmin можно переопределить change_view () , мы можем использовать это, чтобы предотвратить редактирование экземпляров модели после их создания. Вот пример, который я использовал:

def change_view(self, request, object_id, form_url='', extra_context=None):
    messages.error(request, 'Sorry, but editing is NOT ALLOWED')
    return redirect(request.META['HTTP_REFERER'])

2. Условно изменение прав на редактирование

Я также понял, что docs интерпретируют результат ModelAdmin.has_change_permission () по-разному:

Должен возвращать True, если разрешено редактирование obj, в противном случае False. Если   obj - None, должен возвращать True или False, чтобы указать, будет ли редактирование   объектов этого типа разрешено вообще (например, False будет   интерпретируется как означающее, что текущему пользователю не разрешено редактировать   любой объект этого типа).

Значение Я мог проверить, является ли obj None , и в этом случае я возвращаю True , в противном случае я возвращаю False и это фактически позволяет пользователям просматривать список изменений, но не иметь возможности редактировать или просматривать change_form после сохранения экземпляра модели.

def has_change_permission(self, request, obj = None, **kwargs):
    if obj is None:
        return True
    else:
        return False

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

0
0
Похожие сообщества 3
Django [ru]
Django [ru]
5 427 пользователей
Правила: https://t.me/pydjango/500866 Информация: https://github.com/django-ru/faq Работа: @django_jobs
Открыть telegram
django_jobs
django_jobs
3 893 пользователей
Поиск и предложения работы (только связанные с Django) Правила: https://t.me/django_jobs/4 Сообщения с тегом #job или #cv улетают в канал @django_jobs_board Вопросы к @amureki Основной чат @pydjango
Открыть telegram
Django
Django
963 пользователей
Веб-фреймворк для перфекционистов с дедлайнами.
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 4 дня назад
2
Hideo Nakagawa
Зарегистрирован 5 дней назад
3
Sergiy Tytarenko
Зарегистрирован 1 неделю назад
4
shoxrux azadov
Зарегистрирован 1 неделю назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией