Flask-admin создает кнопку рядом с текстовым полем

Я сделал простую форму с помощью Flask-admin, которая выглядит следующим образом. Сейчас я пытаюсь создать кнопку обновления рядом с текстовым полем API, но не знаю, как это сделать.

Это называется виджет или встроенная модель? Я также не смог найти кнопку в WTForms, которую я мог бы использовать. Буду признателен за любые примеры по этому поводу, поскольку я смог переопределить текстовые поля, но не мог легко разместить рядом с ним другие элементы.

введите здесь описание изображения class AdministratorView(sqla.ModelView): page_size = 10

column_searchable_list = (
    'username',
    'description'
)

column_list = (
    'username',
    'apikey',
    'description',
    'active'
)

column_exclude_list = list = (
    'apikey',
    'auth_type'
)

form_excluded_columns = (
    'auth_type',
    'photos'
)

column_labels = {
    'apikey': 'API Key'
}

form_widget_args = {
        'apikey':{
            'readonly':True
        }
}

form_create_rules = (
    rules.FieldSet(('username', 'password', 'description'), 'Personal'),
    rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'),
)

form_edit_rules = (
    rules.FieldSet(('username', 'description'), 'Personal'),
    rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'),
    rules.Header('Reset password'),
    rules.Field('new_password')
)

def get_create_form(self):
    form = self.scaffold_form()
    form.username = fields.StringField('Username', [validators.Required()])
    form.password = fields.PasswordField('Password', [validators.Required()])
    return form

def get_edit_form(self):
    form = self.scaffold_form()
    delattr(form, 'password')
    form.new_password = fields.PasswordField('New Password')
    return form

def on_model_change(self, form, model, is_created):
    if is_created is False:
        if form.new_password.data:
            model.password = generate_password_hash(form.new_password.data)

def is_accessible(self):
    if login.current_user.is_authenticated:
        return login.current_user.has_role('admin')

Редактировать: я могу добавить новый элемент, например заголовок/h1, добавляя html-файл следующим образом:

{% extends 'admin/model/edit.html' %} 
{% block body %} 
    <h1>My custom header</h1> 
    {{ super() }} 
{% endblock %}

Однако я не могу понять, как внести изменения в определенные поля в отображаемой форме. Глядя на edit.html, я вижу следующее. Как мне «попасть внутрь» rendered_form и добавить свою пользовательскую кнопку?

{% block edit_form %}
    {{ lib.render_form(form, return_url, extra(), form_opts) }}
  {% endblock %}

person NeoID    schedule 23.11.2016    source источник
comment
Вместо того, чтобы использовать снимок экрана, вставьте свой код в вопрос правильно, чтобы его можно было проиндексировать, найти, прочитать пользователям программ чтения с экрана и, при необходимости, скопировать для модификации и тестирования, чтобы предоставить ответ.   -  person James Scholes    schedule 23.11.2016
comment
Чтобы добавить дополнительную кнопку в шаблон администратора, вам нужно переопределить шаблон по умолчанию и добавить свою кнопку в унаследованный шаблон. Взгляните на flask-admin.readthedocs.io/en/v1.0.4. /шаблоны   -  person MrLeeh    schedule 24.11.2016
comment
Можно ли создать переопределение для одного поля? Выглядит излишним, чтобы переопределить как edit, так и create.html.   -  person NeoID    schedule 24.11.2016
comment
Вам не нужно создавать переопределение шаблона для каждого (редактировать и создавать). Просто создайте собственный шаблон (например, 'admin/edit_user.html') для одного из них и используйте наследование шаблона Jinjas через {% extends 'admin/edit_user.html' %} для другого.   -  person MrLeeh    schedule 27.11.2016
comment
У меня есть концепция создания блока html и расширения основного макета, но я понятия не имею, как заставить его отображаться рядом с определенным полем, поскольку он динамически создается flask-admin... в моем случае текстовое поле apikey. Самое близкое, что я получаю, это, например, добавить элемент h1 перед формой, но ничего не изменить в самой форме... добавил фрагмент в свой первый пост.   -  person NeoID    schedule 27.11.2016


Ответы (2)


Просто используйте функцию lib.render_form_fields для отображения ваших обычных полей и добавьте кнопку там, где вы хотите. Вы можете использовать render_form_fields с несколькими полями, поэтому вам не нужно переписывать весь шаблон. Вот модифицированная версия flask-admins layout_bootstrap3 пример, который размещает кнопку рядом с полем имени:

{% extends 'admin/model/edit.html' %}

{% block brand %}
    <h2 id="brand">Edit {{ admin_view.name|capitalize }}</h2>
    <div class="clearfix"></div>
    <hr>
{% endblock %}

{% block body %}
  {% call lib.form_tag(form) %}
    <div class="row">
      <div class="col-xs-10">
        {{ lib.render_form_fields([form.name])}}
      </div>
      <div class="col-xs-2">
        <a href="#" class="btn btn-default">Testbutton</a>
      </div>
    </div>
    <div class="row">
      <div class="col-xs-10">
        {{ lib.render_form_fields([form.email])}}
      </div>
    </div>
    <div class="form-buttons">
      {{ lib.render_form_buttons(return_url) }}
    </div>
  {% endcall %}
{% endblock %}
person MrLeeh    schedule 28.11.2016

Используйте form_edit_rules в своем пользовательском представлении, чтобы добавить HTML с помощью правила rules.HTML.

eg:

form_edit_rules = (
    rules.FieldSet(('username', 'description'), 'Personal'),
    rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'),
    rules.HTML('<button onclick="alert('hello')">Refresh</button>'),
    rules.Header('Reset password'),
    rules.Field('new_password')
)
person Martlark    schedule 03.07.2018