2013-10-06 67 views
2

我在我的應用程序中有幾個模型,因爲我會做一些視圖做同樣的事情(表格+表格顯示現有的記錄在我的模型中),但由於模型實現不同,在每種情況下都會有所不同,我想知道是否有可能使其具有通用性。通過模型字段在忍者模板中迭代

我GOOGLE了一下,無法找到任何與我的情況相關的東西。 我想什麼來實現:

在我看來,我想通過從我傳遞給模板的模型中的每個對象,例如:

return render_template('addstatus.html', form=form, statuses=Status.query.all(), 
     target_model="Status", fields=Status.__mapper__.c.keys()) 

但我想只有一個不管模型是什麼,所以我無法預先知道模型的字段,列的數量等等。

我想有這樣的事情在我看來:

{% for obj in objects %} 
    {% for field in obj.fields %} (not existing) 
     <h1> {{ field }} :: {{ obj.fields.field.value }} 
    {% endfor %} 
{% endfor %} 

有什麼事情可能嗎?我怎樣才能做到這一點?

+0

看來要遍歷模型中所有已定義的列,然後使用結果自動創建表單。它看起來像是在模板所需的路上,但正在尋找如何遍歷列。我建議你看看[這些](http://stackoverflow.com/questions/2537471/method-of-iterating-over-sqlalchemy-models-defined-columns)[問題](http://stackoverflow.com/questions/2441796/how-to-discover-table-properties-from-sqlalchemy-mapped-object),它會告訴你如何做到這一點。那麼你只需要將這些想法結合在一起。 –

+0

我其實不想創建表單。我想創建一個

,但事先並不知道我的for循環中的模型字段和對象模型值。 –

+0

對不起,我應該說「HTML」而不是「表單」。然而,同樣的想法也適用:你需要的唯一缺失的鏈接就是確定如何循環聲明式SQLAlchemy模型中的字段。那些其他問題告訴你如何能夠做到這一點。 –

回答

4

可以(可以通過繼承或通過的Monkeypatching)此方法添加到您的db.Model類:

from sqlalchemy.orm import class_mapper, ColumnProperty 
def columns(self): 
    """Return the actual columns of a SQLAlchemy-mapped object""" 
    return [prop.key for prop in class_mapper(self.__class__).iterate_properties 
      if isinstance(prop, ColumnProperty)] 

然後你可以使用{% for col in obj.columns() %}遍歷列名。

0

我有一個類似的問題,並希望純粹基於Jinja2的東西。這將返回所有在「目標文件」表中的鍵/字段,以及工作很適合我:

obj.__table__.columns._data.keys() 

這是你的示例代碼實現

{% for obj in objects %} 
    {% for field in obj.__table__.columns._data.keys() %} 
     <h1> {{ field }} :: {{ obj[field] }} </h1> 
    {% endfor %} 
{% endfor %}