Flask-редактируемый администратором фильтр выбора столбца на основе строк

#flask #flask-sqlalchemy #flask-admin

#flask #flask-sqlalchemy #колба-администратор

Вопрос:

Я использую flask-admin для простого редактирования моей модели БД. Речь идет о сдаче лыж в аренду клиентам.

Это мой вид аренды (модель базы данных sql_alchemy соответствует):

 class RentalView(ModelView):
    column_list = ("customer", "from_date", "to_date", "ski", "remarks")
    ...
  

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

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

Я пытался делать

 def on_form_prefill(self, form, id):
    query = db.session.query... # do the query based on the rental "id"
    form.ski.query = query
  

и это правильно показывает отфильтрованные запросы. Однако при отправке формы .query атрибут QuerySelectField ski None снова используется, что приводит к query = self.query or self.query_factory() TypeError: 'NoneType' object is not callable ошибке. Не знаю, почему запрос сбрасывается ?!

Кто-нибудь знает другую стратегию обработки динамических запросов на основе идентификатора редактируемого объекта?

Ответ №1:

Используйте этот шаблон, переопределите метод представления edit_form , создайте форму редактирования по умолчанию (вызвав метод, super() затем измените форму по своему усмотрению:

 class RentalView(ModelView):

    # setup edit forms so that Ski relationship is filtered
    def edit_form(self, obj):

        # obj is the rental instance being edited
        _edit_form = super(RentalView, self).edit_form(obj)

        # setup your dynamic query here based on obj.id
        # for example

        _edit_form.ski.query_factory = lambda: Ski.query.filter(Ski.rental_id == obj.id).all()

        return _edit_form
  

Комментарии:

1. Спасибо! Это сработало просто отлично, но я думал, что тоже попробовал это. Я думаю, магия отладки. Дело в том, что on_form_prefill вызывается только во время создания, запроса GET, поэтому, когда форма публикуется, query_factory не задан, что приводит к ошибке (даже если это на самом деле не нужно, поскольку все, о чем мы заботимся в сообщении, — это выбранные данные).