2014-02-21 58 views
5

海蘭大家, 我意識到一個瓶/ MongoDB的項目,因爲我是新來這個世界上,我已經按照這個網頁教程: http://docs.mongodb.org/ecosystem/tutorial/write-a-tumblelog-application-with-flask-mongoengine/Mongoengine,瓶和ReferenceField在WTForms

之後,我開始編寫自己的應用程序,這是部分代碼:

機型:

class Generic(db.Document): 
    descrizione = db.StringField(max_length=255, required=True) 

    meta = { 
     'allow_inheritance': True, 
     'indexes': [ 
      {'fields': ['descrizione'], 'unique': True} 
     ] 
    } 

class Category(Generic): 
    def __call__(self, *args): 
     pass 

class User(db.Document): 
    email = db.EmailField(max_length=255, required=True) 
    nickname = db.StringField(max_length=255, required=True) 
    password = db.StringField(max_length=16, required=True) 
    categoria = db.ReferenceField('Category', required=True) 

    meta = { 
     'indexes': [ 
      {'fields': ['nickname', 'email'], 'unique': True} 
     ] 
    } 

正如你可以在上面看到,我有一個「分類」類繼承了「通用「班。 「User」類最終有一個ReferenceField類別。這樣,當我創建一個用戶時,mongo數據庫中的類別字段被存儲爲一個ObjectID,與包含我創建的所有類別的「generic」集合相關。

下一步是創建將新文檔插入用戶集合的表單。 在我的意見Python文件我有這個COSE:

def iscrizione(): 

    form = model_form(User, only=['email', 'nickname', 'password', 'categoria'])(request.form) 

    if request.method == 'GET': 
     ctx = { 
      'form': form 
     } 
     return render_template('users/iscrizione.html', **ctx) 

模板使用的神社宏教程頁報道:

{% macro render(form) -%} 
<fieldset> 
{% for field in form %} 
{% if field.type in ['CSRFTokenField', 'HiddenField'] %} 
    {{ field() }} 
{% else %} 
    <div class="clearfix {% if field.errors %}error{% endif %}"> 
    {{ field.label }} 
<div class="input"> 
    {% if field.name == "body" %} 
    {{ field(rows=10, cols=40) }} 
    {% else %} 
    {{ field() }} 
    {% endif %} 
    {% if field.errors or field.help_text %} 
    <span class="help-inline"> 
    {% if field.errors %} 
     {{ field.errors|join(' ') }} 
    {% else %} 
     {{ field.help_text }} 
    {% endif %} 
    </span> 
    {% endif %} 
</div> 
</div> 
{% endif %} 
{% endfor %} 
</fieldset> 
{% endmacro %} 

最後,這是我的問題 (如果你已經達到了這樣的文字,你是我的英雄)

當我訪問與呈現形式的網頁,宏正確顯示文本字段,併爲ReferenceField在我的模型顯示它交流ombo框。 選擇組合中的選項值與我創建的類別文檔的對象ID完全對齊。選擇其中一個並提交表單,我的應用程序就能正確創建新的用戶文檔。

不幸的是,選擇框標籤不顯示人類可讀的值,報告「類別對象」。

<select id="categoria" name="categoria"> 
    <option value="530536363c74031c24ee7ab6">Category object</option> 
    <option value="5305362d3c74031c24ee7ab5">Category object</option> 
    <option value="530535793c74031b73dd07b4">Category object</option> 
</select> 

如何設置爲選擇框顯示正確的標籤?

回答

3

最後我做到了! 假設用戶文檔的字段「categoria」是「Category」集合的ReferenceField。 只需使用要作爲標籤的類別模型的字段名稱將「label_attr」屬性添加到「form.categoria」。

def iscrizione(): 
    form = model_form(User, only=['email', 'nickname', 'password', 'categoria'])(request.form) 
    form.categoria.label_attr='descrizione' #<< add this line 
    if request.method == 'GET': 
     ctx = { 
     'form': form 
    } 
    return render_template('users/iscrizione.html', **ctx) 
1

這也可以通過在model_form功能領域ARGS提出:

form = model_form(
    User, 
    only=['email', 'nickname', 'password', 'categoria'], 
    field_args={'categoria': {'label_attr': 'descrizione'}} 
) 
0

也許它會成爲有用的人。您可以使用標準的辦法,像你的Category類

定義

def __str__(self): 
    return self.descrizione