Поле только для чтения в режиме редактирования - Flask-Admin - PullRequest
0 голосов
/ 28 июня 2018

Я попытался установить поле формы как readonly только для представления edit в приложении Flask-Admin. После ответов на этот вопрос я знаю, что если у меня есть этот

class MyView(ModelView):
    form_widget_args = {
        'title': {
            'readonly': True
        }
    }

Я могу установить поле формы как readonly, но это применимо как к созданию , так и редактированию представлений. Как применить аргумент только к представлению edit ?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Чистое решение на Python может использовать функцию обратного вызова on_form_prefill, которую предоставляет администратор, и она запускается только в режиме редактирования. Вам не понадобится form_widget_args в этом случае.

У вас может быть что-то вроде этого, чтобы динамически редактировать форму, делая это поле доступным только для чтения:

class MyView(ModelView):
  def on_form_prefill(self, form, id):
    form.title.render_kw = {'readonly': True}
0 голосов
/ 18 сентября 2018

Другой способ сделать это - использовать form_edit_rules и form_create_rules . Отобразите поля, которые вы хотите видеть только в режиме создания, и добавьте поле, которое вы хотите отобразить в режиме редактирования, и сделайте его доступным только для чтения

form_create_rules = (
    'col1', 'col2', 'col3')
form_edit_rules = (
    'col1', 'col2', 'col3', 'col4)

form_widget_args = {
    'col4': {
        'disabled': True
    }
}
0 голосов
/ 04 июля 2018

Я бы сделал небольшой обходной путь для этого. Создайте пользовательский шаблон редактирования и добавьте его в свой класс. Стандартный шаблон редактирования, который вы найдете в хранилище фляг на github (стандартный шаблон редактирования)

class MyView(ModelView):
    edit_template = 'my_custom_edit_template.html'

И в вашем собственном шаблоне редактирования сделайте функцию javascript, которая отключит ваш элемент. Поэтому он отключен только в режиме редактирования, а не в режиме создания.

{% block tail %}
    {{ super() }}
    {{ lib.form_js() }}
    <script>
    window.onload = function () {
        document.getElementById("myfield_id").disabled = true;
    }
    </script>
{% endblock %}

Возможно, это не лучшее решение, но оно работает для меня. Я думаю, что также должно быть возможно изменить шаблон jinja2, чтобы напрямую отключить поле. Я попытался: {{form.myfield_id (disabled = True)}}, но затем он дважды отображает мое поле ... но мой первый подход работает.

...