#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 не задан, что приводит к ошибке (даже если это на самом деле не нужно, поскольку все, о чем мы заботимся в сообщении, — это выбранные данные).