簡體   English   中英

WTForms中的Mongoengine,Flask和ReferenceField

[英]Mongoengine, Flask and ReferenceField in WTForms

大家好,我正在實現一個Flask / MongoDB項目,並且由於我是這個世界的新手,所以我遵循了此頁面上的教程: http : //docs.mongodb.org/ecosystem/tutorial/write-a-tumblelog -燒瓶應用程序/

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

楷模:

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}
        ]
    }

如您在上面看到的,我有一個“類別”類,該類繼承了“通用”類。 最后,“用戶”類對類別具有一個ReferenceField。 這樣,當我創建用戶時,mongo db上的類別字段將存儲為ObjectID,與“通用”集合相關,該集合具有我創建的所有類別。

下一步是創建表單以將新文檔插入用戶集合。 在我的Views python文件中,我有這個意思:

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)

該模板使用教程頁面中報告的Jinja宏:

{% 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,則顯示了一個組合框。 select組合中的選項值與我創建的類別文檔的對象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>

如何設法為選擇框顯示正確的標簽?

終於我做到了! 假設用戶文檔的字段“類別”是“類別”集合的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)

也可以通過model_form函數中的args字段來實現:

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

也許對某人有用。 您可以使用標准方法,例如定義

def __str__(self):
    return self.descrizione

為您的類別課程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM