2016-10-20 22 views
0

丟失在執行我的瓶的應用程序,我得到以下警告:瓶管理員UserWarning:字段從規則集

C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: password 
    warnings.warn(text) 
C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: new_password 
    warnings.warn(text) 
* Restarting with stat 
C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: password 
    warnings.warn(text) 
C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: new_password 
    warnings.warn(text) 

我通常使用form_excluded_columns從我的窗體中刪除不需要的字段,但是這一次我有一個很難擺脫這些錯誤。

這是我的觀點:

class AdministratorView(sqla.ModelView): 
    page_size = 10 

    column_searchable_list = (
     'username', 
     'description' 
    ) 

    column_list = (
     'username', 
     'apikey', 
     'description', 
     'active' 
    ) 

    column_exclude_list = list = (
     'apikey', 
     'source' 
    ) 

    form_excluded_columns = (
     'source', 
     'photos' 
    ) 

    column_labels = { 
     'apikey': 'API Key' 
    } 

    form_widget_args = { 
      'apikey':{ 
       'readonly':True 
      } 
    } 

    form_create_rules = (
     rules.FieldSet(('username', 'password', 'description'), 'Personal'), 
     rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'), 
    ) 

    form_edit_rules = (
     rules.FieldSet(('username', 'description'), 'Personal'), 
     rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'), 
     rules.Header('Reset password'), 
     rules.Field('new_password') 
    ) 

    def on_model_change(self, form, model, is_created): 
     if is_created is False: 
      if form.new_password.data: 
       model.password = generate_password_hash(form.new_password.data) 

    def scaffold_form(self): 
     form_class = super(AdministratorView, self).scaffold_form() 
     form_class.password = fields.PasswordField('Password', [validators.Required()]) 
     form_class.new_password = fields.PasswordField('New Password') 
     return form_class 

    def is_accessible(self): 
     if login.current_user.is_authenticated: 
      return login.current_user.has_role('admin') 

這一觀點的目的是使創建形式和編輯窗體上的可選的「新密碼」 - 場在一個單一的,需要密碼字段。我明白,當我在form_create_rules和form_edit_rules中不包含password/new_password時會出現警告,但將這些字段添加到form_excluded_columns中並不能解決此問題。

關於如何擺脫警告的任何提示?

編輯

我想我應該還是用get_create_form和get_edit_form,而不是隻scaffold_form。一個好處是,這使得更容易分開覆蓋每個表單。我可以進一步簡化嗎?我應該做這樣的需求驗證還是將nullable = False添加到數據庫模式(SQLAlchemy)?

class AdministratorView(sqla.ModelView): 
    page_size = 10 

    column_searchable_list = (
     'username', 
     'description' 
    ) 

    column_list = (
     'username', 
     'apikey', 
     'description', 
     'active' 
    ) 

    column_exclude_list = list = (
     'apikey', 
     'source' 
    ) 

    form_excluded_columns = (
     'source', 
     'photos' 
    ) 

    column_labels = { 
     'apikey': 'API Key' 
    } 

    form_widget_args = { 
      'apikey':{ 
       'readonly':True 
      } 
    } 

    form_create_rules = (
     rules.FieldSet(('username', 'password', 'description'), 'Personal'), 
     rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'), 
    ) 

    form_edit_rules = (
     rules.FieldSet(('username', 'description'), 'Personal'), 
     rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'), 
     rules.Header('Reset password'), 
     rules.Field('new_password') 
    ) 

    def get_create_form(self): 
     form = self.scaffold_form() 
     form.username = fields.StringField('Username', [validators.Required()]) 
     form.password = fields.PasswordField('Password', [validators.Required()]) 
     return form 

    def get_edit_form(self): 
     form = self.scaffold_form() 
     delattr(form, 'password') 
     form.new_password = fields.PasswordField('New Password') 
     return form 

    def on_model_change(self, form, model, is_created): 
     if is_created is False: 
      if form.new_password.data: 
       model.password = generate_password_hash(form.new_password.data) 

    def is_accessible(self): 
     if login.current_user.is_authenticated: 
      return login.current_user.has_role('admin') 

回答