flask-admin: Как отображать значимую информацию о внешнем ключе в формах редактирования и создания?

У меня есть интерфейс Flask-Admin для приложения Flask, использующего SQLAlechemy, и я не могу понять, как обрабатывать внешние ключи. Конкретно у меня две модели:

class DoctorType(db.Model):
    __tablename__ = 'doctor_type'
    id = db.Column(db.Integer, primary_key=True)
    doctor_type_english_name = db.Column(db.Unicode(255))
    doctors = db.relationship('Doctor')

    def __unicode__(self):
        return self.doctor_type_english_name

class Doctor(db.Model):
    __tablename__ = 'doctor'
    id = db.Column(db.Integer, primary_key=True)
    doctor_english_name = db.Column(db.Unicode(255))
    doctor_type_id = db.Column(db.Integer, db.ForeignKey('doctor_type.id'))

    def __unicode__(self):
        return self.doctor_english_name

Я бы хотел, чтобы поле doctor_type_id в формах создания или редактирования flask-admin было выпадающим списком doctor_type_english_name, а не просто целочисленным вводом, подобным этому:

Поле ввода типа врача

У меня __unicode__ функций на моделях (я использую python 2.7). Я попытался повозиться с form_ajax_refs в своих пользовательских представлениях формы, но безуспешно. Любая помощь приветствуется!


person Matthew Markwell    schedule 29.05.2017    source источник


Ответы (2)


Реализуйте __repr__ в определении модели данных.

class DoctorType(db.Model):
    #...
    def __repr__(self):
        return self. doctor_type_english_name
person stamaimer    schedule 29.05.2017
comment
Добавление __repr__ не поможет, так как в этом случае он делает то же самое, что и функция __unicode__. Внешний ключ по-прежнему отображается как целочисленное поле в формах редактирования и удаления. Спасибо за быстрый ответ! - person Matthew Markwell; 31.05.2017
comment
Вы пробовали реализовать __repr__ в своем определении модели? __repr__ и __unicode__ у меня работают. - person stamaimer; 31.05.2017
comment
Я сделал. Я понял, что не хватает отношений, а не __repr__. Еще раз спасибо за ответ! Я поддержал ваш ответ, но у меня пока недостаточно представителей, чтобы проголосовать за что-либо :-( - person Matthew Markwell; 01.06.2017
comment
Это замечательно. Он работает как шарм, с таким маленьким кодом! - person leosok; 27.10.2018

Оказывается, мне не хватало отношения между классом Doctor и классом DoctorType. Я реализовал это с помощью обратной ссылки в отношении DoctorType.doctors:

class DoctorType(db.Model):
    __tablename__ = 'doctor_type'
    id = db.Column(db.Integer, primary_key=True)
    doctor_type_english_name = db.Column(db.Unicode(255))
    doctors = db.relationship('Doctor', backref='doctor_type')

    def __unicode__(self):
        return self.doctor_type_english_name

Как только я добавил это, в формах редактирования и создания «Доктор» в flask-admin появилось новое поле под названием Doctor Type, которое представляло собой раскрывающийся список значений DoctorType.doctor_type_english_name, а поле Doctor Type ID исчезло по умолчанию. Это то поведение, которого я хотел.

person Matthew Markwell    schedule 31.05.2017