2013-10-03 117 views
2

我使用wtforms - 炼金术在我的龙卷风应用渲染SQLAlchemy的模式,以HTML形式是这样的:Wtforms-炼丹字段顺序

class UserProfileForm(ModelForm): 
    class Meta: 
     model = models.User 
     only = ['username', 'first_name', 'last_name'] 

它工作得很好,但表单上的字段是为了姓氏,用户名,名字,这可能会让用户感到困惑。有没有办法设置生成的表单字段的特定顺序?

回答

2

我做了什么this后提出,其已经为我工作完美无缺。

简而言之,添加一个指定正确顺序的类关键字,然后更新_unbound_fields从iter字段按正确的顺序。

2

您应该将表单的渲染放在模板中。

{{ form.username }} 
{{ form.first_name }} 
{{ form.last_name }} 
+3

感谢您的回应!但是,如果只是这么简单...... 请参阅我正在以自动方式呈现所有表格(我有相当多的表格),如下所示: '{%for field in form%}

{%原料field.label%}
{%原字段%}
{%结束%}' 其实,我使用wtforms - 炼金术库的唯一原因是为了避免像一个你”样板已经提供。 所以我最初的问题归结为:如何提供字段顺序没有任何明确的形式枚举模板? –

1

解决方案https://stackoverflow.com/a/18475322/892040ModelForm继承时不起作用。然而,这确实有效:

class ItemReview(ModelForm): 
    class Meta: 
     model = Item 
    _field_order = ['field1', 'field2'] 

    def __init__(self, *args, **kwargs): 
     super(ItemReview, self).__init__(*args, **kwargs) 
     field_order = getattr(ItemReview, '_field_order') 
     visited = [] 
     if field_order: 
      new_fields = OrderedDict() 
      for field_name in field_order: 
       if field_name in self._fields: 
        new_fields[field_name] = self._fields[field_name] 
        visited.append(field_name) 
      for field_name in self._fields: 
       if field_name in visited: 
        continue 
       new_fields[field_name] = self._fields[field_name] 
      self._fields = new_fields