2014-04-08 2 views
6

Я учусь колбовую Администратор в сочетании с PeeWee Backend видовую (но мой вопрос может быть применен к SQLAlchemy бэкэндом тоже), и есть две вещи, которые я не мог найти в документации или примеров:Пользовательская проверка флажка-администратора ModelView?

(1). Когда у меня моя модель имеет уникальное поле, и я тестирую/пытаюсь ее дублировать, я получаю экран сбоя по умолчанию Flask, с сообщением: «IntegrityError: имя пользователя в столбце не уникально»

Я тестирую пример PeeWee в https://github.com/mrjoes/flask-admin/blob/master/examples/peewee/simple.py, и я сменил строку 21 на «username = peewee.CharField (max_length = 80, unique = True)»

Затем я пытаюсь добавить двух пользователей с именем «username» = «user1».

Есть ли вежливый способ вернуться на экран редактирования (или даже экран списка, любой экран администратора будет делать), но с управляемым сообщением об ошибке? Мне не нужно специальное сообщение об ошибке, текущее сообщение в порядке (IntegrityError: имя пользователя столбца не уникально). Но я не вижу краш-экрана.

Я мог установить/использовать флэшку по умолчанию 500 страниц, но затем я бы вышел из потока Flask-Admin, и пользователь «пропустил» данные, которые он только что напечатал.

Я хотел бы вернуться к экрану редактирования, но с каким-то предупреждением/сообщением об ошибке. Я не возражаю, чтобы расширять шаблоны, это не проблема. Но я не мог найти места, чтобы перехватить ошибку и правильно ее обработать. Какие-либо предложения?

и (2):

мне нужен способ, чтобы добавить некоторые проверки предварительно сохранить в потоке. Например, я в форме редактирования сущности, у которой есть initial_date и final_date, и я хочу убедиться, что final_date больше, чем initial_date или имеет значение null, перед сохранением.

Я мог бы сделать это на стороне клиента, используя javascript, расширяя шаблон редактирования для этого объекта и добавляя свой скрипт проверки в хвостовой блок (и перехватывая событие form.submit).

Но что, если моя проверка требует некоторой проверки на последней минуте на стороне сервера? Есть ли способ/место для перехвата потока и добавления моей проверки, и с удачей, отбросьте мое сообщение об ошибке, таким же образом, как обсуждалось в вопросе 1?

спасибо заранее,

С уважением,

+0

Причина, по которой происходит сбой - Flask-Admin удалит все исключения (даже IntegrityError), когда Flask работает в режиме отладки. Я собираюсь добавить обработку IntegrityError как исключение из этого правила. Предварительное сохранение может быть выполнено в форме или в 'on_model_change' - вы можете исключить исключение. Пока исключение будет показано с помощью отладчика Werkzeug, в режиме производства вы увидите сообщение с хорошей ошибкой. – Joes

+0

@Joes 'on_model_change' - это крюк после сохранения, как указано в документации:« Выполняйте некоторые действия ** после того, как ** будет создана или обновлена ​​модель ». В приложении Flask admin AFAIK нет предустановленного кэша. базовый класс формы и настройка в подклассе - это единственный способ ответить на вопрос OP. – Devy

+0

@Devy 'on_model_change' вызывается, когда модель была обновлена ​​данными формы, но до того, как сеанс был привязан к базе данных. Таким образом, исключение исключений могло бы предотвратить любые изменения – Joes

ответ

11

Я думаю, я нашел некоторые вещи, которые помогают, но не completelly ответить на мой вопрос.

я опубликовал пример на Pastebin: http://pastebin.com/siwiaJAw

первых, я не мог найти «прежде чем сохранить» шаг, но я нашел, как добавить поле уровня пользовательской проверки, который помогает в случаях создает и обновления.

Если вы проверяете пример, вы увидите строки 37-39 и 42-44, где я добавил:

def no_root_allowed(form, field): 
    if field.data == 'root': 
     raise ValidationError('"root" is not allowed') 

form_args = dict(
    username=dict(validators=[no_root_allowed]) 
) 

Этот валидатор принимает «форму» и «поле» и таким образом я могу сделать валидации, включают в себя более одного поля (например, дата начала <), и я, возможно, даже, возможно, даже получу доступ к классам модели для проверки дублирования id, например.

Итак, это разрешает проверку на создание/редактирование. Если валидатор выходит из строя, Flask-Admin возвращает меня обратно в форму редактирования, уже заполненную. Ницца!

Но есть проблемы с удалениями. Если я не хочу, чтобы конкретный объект был удален, я могу указать его как can_delete = False, но это предотвратит удаление любого экземпляра.

Лучшее, что я мог найти, - это перехватить метод delete_model (строка 55) и вернуть False в случае неудачного подтверждения проверки. Но это не вызвало бы никакого сообщения и просто вернуло меня к форме. Я не мог найти способ отправить сообщение пользователю, что он не может удалить этот конкретный экземпляр.

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

спасибо!

+0

Спасибо TON за публикацию этого вопроса. Сэкономил много времени на поиски. – Chrispy

+0

Знаете ли вы, есть ли возможность, чтобы пользовательский валидатор мог проверить, обновляет ли он существующую модель или создает новую? Что-то вроде is_created атрибут? – Chrispy

 Смежные вопросы

  • Нет связанных вопросов^_^