Как переопределить логику удаления в Flask Admin? - PullRequest
1 голос
/ 03 июля 2019

Я искал в Google и StackOverflow об этом.По сути, я хочу попробовать переопределить функцию удаления в Flask-Admin, чтобы на самом деле не удалять запись, а вместо этого обновить строку объекта с именами «selected_by» и «delete_on».

Я нашел нескольковопросы о StackOverflow, в которых объясняется, как изменить логику кнопки сохранения с помощью on_model_change, но не говорится о логике удаления модели.Я также не нашел никакой информации об этом в документации.Может кто-нибудь показать мне, как я должен решить эту проблему?

Заранее спасибо!

1 Ответ

1 голос
/ 03 июля 2019

Метод переопределения delete_model по вашему мнению.Вот поведение по умолчанию , если вы используете представления Sqlalchemy, обратите внимание на вызов self.session.delete(model) в блоке try ... except.

def delete_model(self, model):
    """
        Delete model.
        :param model:
            Model to delete
    """
    try:
        self.on_model_delete(model)
        self.session.flush()
        self.session.delete(model)
        self.session.commit()
    except Exception as ex:
        if not self.handle_view_exception(ex):
            flash(gettext('Failed to delete record. %(error)s', error=str(ex)), 'error')
            log.exception('Failed to delete record.')

        self.session.rollback()

        return False
    else:
        self.after_model_delete(model)

    return True

Вам понадобится что-то подобное в вашемview:

class MyModelView(ModelView):


   def delete_model(self, model):
        """
            Delete model.
            :param model:
                Model to delete
        """
        try:
            self.on_model_delete(model)
            # Add your custom logic here and don't forget to commit any changes e.g. 
            # self.session.commit()
        except Exception as ex:
            if not self.handle_view_exception(ex):
                flash(gettext('Failed to delete record. %(error)s', error=str(ex)), 'error')
                log.exception('Failed to delete record.')

            self.session.rollback()

            return False
        else:
            self.after_model_delete(model)

        return True

Также, возможно, вы не захотите беспокоиться о вызовах self.on_model_delete(model) и self.after_model_delete(model), потому что по умолчанию они ничего не делают.

...