Как мне установить значение по умолчанию для поля связи в flask_admin на основе параметра url?

#flask #flask-admin

#flask #flask-admin

Вопрос:

Допустим, у меня объявлены следующие модели:

 class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',
                                lazy='dynamic')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
  

И я хотел бы создать представление, в котором пользователь может просматривать и добавлять сведения к объекту Person. Я хочу иметь кнопку для добавления адреса, которая выглядит примерно так:

 <a href='{{ url_for('address.create_view',person=get_value(model,'id'))}}' class='btn'>Add</a>
  

Теперь моя проблема в том, как установить person_id в значение, которое было отправлено? В идеале я хотел бы скрыть выпадающий виджет person и превратить его в скрытое поле с отправленным значением. Но я бы согласился просто выбрать правильного пользователя из выпадающего списка person в форме адреса.

Спасибо.

Ответ №1:

Вы можете переопределить create_form метод вашего ModelView :

 class PersonView(ModelView):
    def create_form(self):
        form = super(PersonView, self).create_form()
        person_id = request.args.get('person_id')
        if person_id and not form.person_id.data:
            form.person_id.data = person_id
        return form
  

Ответ №2:

Вы можете добавить дополнительный столбец в свое представление и добавить средство форматирования для этого столбца. Например:

 class PersonView(ModelView):
    column_list = ('id', 'name', 'action')
    column_formatters = {'action': format_action}

# define the formatter
def format_action(view, context, model, name):
    person_id = model.id
    return "your html with person ID: %s" % person_id
  

пожалуйста, прочитайте документ