У меня есть User
admin ModelView с form_extra_field constituency
, и я хотел, чтобы он динамически загружался выборы (это SelectField). Модель для этого представления - User
, в которой группа будет храниться как id
элемента.
Я пытался загрузить выборы из удаленного API, но, конечно, было неподходящее время для загрузки этих вещейиз-за RuntimeError: Работа вне контекста приложения. Это произошло при команде миграции ...venv/bin/flask db init -d ctiweb/migrations
. Я прочитал некоторый API_KEY из объекта конфигурации, который должен иметь контекст приложения ...
Таким образом, решением будет выбор загрузки при обслуживании или рендеринге времени. Я не хочу иметь решение в настроенном шаблоне, а хочу в настроенном администраторе ModelView для User
модели.
Есть ли такое решение? Могу ли я перегрузить какой-то метод ModelView, который уже имеет контекст приложения (как, например, во время обслуживания данных или шаблона рендеринга)?
часть исходного кода из models.py
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(128))
email = db.Column(db.String(255), nullable=False)
is_superuser = db.Column(db.Boolean())
constituency_id = db.Column(db.Integer())
def __str__(self):
return self.username
@property
def password(self):
raise AttributeError("not readable attribute")
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
часть исходного кодаот admin.py
from flask_admin.contrib.sqla import ModelView
class UserAdminModelView(ModelView):
def serve_constituency_choices():
consituencies = (
get_constituency(constituency_id) for constituency_id in get_constituencies()
)
return ((constituency['id'], constituency['name']) for constituency in consituencies)
column_list = ['username', 'email', 'is_superuser']
form_columns = ['username', 'email', 'password', 'is_superuser', 'constituency']
form_extra_fields = {
'password': PasswordField('Password'),
'constituency': SelectField('Constituency', choices=serve_constituency_choices())
}