Как сделать поле не редактируемым в представлении администратора Flask класса модели

у меня есть User класс модели и password является одним из многих атрибутов. Я использую Flask web framework и расширение Flask-Admin для создания представления администратора моих классов моделей. Я хочу сделать определенные поля в представлении администратора, как password не редактируется или не показывать их вообще. Как мне это сделать?

Я могу сделать поля не отображаются в обычном режиме, но когда я нажимаю на кнопку редактирования любой записи в таблице, все поля отображаются и доступны для редактирования.

3 ответов


вы должны расширить свое представление из ModelView и перезаписать необходимые поля.

в моем классе это выглядит так:

class UserView(ModelView):

    column_list = ('first_name', 'last_name', 'username', 'email')
    searchable_columns = ('username', 'email')
# this is to exclude the password field from list_view:
    excluded_list_columns = ['password']
    can_create = True
    can_delete = False
# If you want to make them not editable in form view: use this piece:
    form_widget_args = {
        'name': {
            'readonly': True
        },
    }

надеюсь, что это помогает! Для получения дополнительной информации ознакомьтесь с документацией:


вот решение, которое расширяет ответ римо, и это Так что ответ. Это позволяет для различных field_args для редактирования и создания форм.

Пользовательский Класс Правил Поля

from flask_admin.form.rules import Field

class CustomizableField(Field):
    def __init__(self, field_name, render_field='lib.render_field', field_args={}):
        super(CustomizableField, self).__init__(field_name, render_field)
        self.extra_field_args = field_args

    def __call__(self, form, form_opts=None, field_args={}):
        field_args.update(self.extra_field_args)
        return super(CustomizableField, self).__call__(form, form_opts, field_args)

Класс UserView

class UserView(ModelView):

    column_list = ('first_name', 'last_name', 'username', 'email')
    searchable_columns = ('username', 'email')

    # this is to exclude the password field from list_view:
    excluded_list_columns = ['password']
    can_create = True
    can_delete = False

    # If you want to make them not editable in form view: use this piece:
    form_edit_rules = [
        CustomizableField('name', field_args={
            'readonly': True
        }),
        # ... place other rules here
    ]

еще один способ обойти проблему - использовать метод Flask-Admin ModelView под названием on_form_prefill для установки аргумента свойства readonly. Согласно Flask-Admin Docs:

on_form_prefill(форма, id)

выполнить дополнительные действия для предварительного заполнения формы редактирования.

вызывается из edit_view, если текущее действие представляет форму, а не получает ввод на стороне клиента, после предварительного заполнения по умолчанию выполненный.

другими словами, это триггер, который запускается при открытии только изменить форму не создать один.

таким образом, решение для примера, используемого выше, будет:

class UserView(ModelView):
    ...
    def on_form_prefill(self, form, id):
        form.name.render_kw = {'readonly': True}

метод запускается после применения всех других правил, поэтому ни одно из них не нарушается, включая набор столбцов.