在flask-admin中呈现给用户的编辑表单之前,如何访问模型字段值?

问题描述

我有模型用户

 class User(db.Model):

    __tablename__ = "users"

    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(50),unique=True,nullable=False)
    token_life_time = db.Column(db.Integer,nullable=False)

以及从flask-admin获得的ModelView:

class usermodelView(ModelView):

    column_list = ('id','username','token_life_time')
    form_create_rules = ('username','token_life_span') # custom field,that doesn't exist in actual model
    form_edit_rules = ('username','token_life_time','new_token_life_time')
    form_extra_fields = {
        'token_life_span': StringField(default='1-0-0-0',validators=[Datarequired()]),'new_token_life_time': StringField() # how to put here actual value from model.token_life_time as default value in EDIT form ???
    }

    column_formatters = dict(
        token_life_time=lambda v,c,m,p: usermodelView.convert_seconds_to_human_readable(m.token_life_time)
    )
    
    def on_model_change(self,form,model,is_created):
        token_time = form.data.get('token_life_span',None)
        if token_time:
            model.token_life_time = self.convert_to_seconds(token_time) # my custom function  that converts string of format (days-hours-minutes-seconds,example: 1-8-23-15) into seconds for storing in DB int type

我想在呈现给用户的EDIT表单之前访问 model.token_life_time 值,并将其从秒转换为人类可读的字符串(包括天,小时等)。然后将转换后的值作为认值以编辑形式( new_token_life_time )放入自定义字段

问题是-如何从模型访问实际值,然后将转换后的值作为认值以EDIT形式放在自定义字段中?

解决方法

覆盖视图的edit_form方法-请参见documentation

类似以下内容:

class UserModelView(ModelView):

    def edit_form(self,obj=None):
        form = super().edit_form(obj=obj)
        # calculate token_life_span
        _token_life_span = get_token_life_span(obj.token_life_time)
        form.token_life_span.data = _token_life_span
        return form