3

プロジェクトにFlask、mongoengineを使用しており、 http: //docs.mongodb.org/manual/tutorial/write-a-tumblelog-application-with-flask-mongoengine/から基本的な機能を取得しようとしています

上記のリンクからすべてを実装した後、投稿に「タグ」用の新しいフィールドを追加しました。投稿を作成しようとすると、タグに入力ボックスが表示されません。

どんな助けでも大歓迎です。

以下の私のコードとスクリーンショット

class Post(db.DynamicDocument):
    created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
    title = db.StringField(max_length=255, required=True)
    slug = db.StringField(max_length=255, required=True)
    comments = db.ListField(db.EmbeddedDocumentField('Comment'))
    tags = db.ListField(db.StringField(max_length=30)) # New field I added

ここに画像の説明を入力

ここに画像の説明を入力

テンプレートフォーム

{% 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 %}

フォーム コードのレンダリング

{% extends "admin/base.html" %}
{% import "_forms.html" as forms %}

{% block content %}
<h2>
  {% if create %}
  Add new Post
  {% else %}
  Edit Post
  {% endif %}
</h2>

<form action="?{{ request.query_string }}" method="post">
  {{ forms.render(form) }}
  <div class="actions">
    <input type="submit" class="btn primary" value="save">
    <a href="{{ url_for("admin.index") }}" class="btn secondary">Cancel</a>
  </div>
</form>
{% endblock %}
4

1 に答える 1

3

私が収集できることから、あなたの問題は、WTF にタグ フィールドをレンダリングするように指示していることですが、WTForms はその情報を処理する方法を知りません。

Flask-MongoEngine のドキュメントを見ると、はListFieldWTForms が参照してFieldListいるように見えます。

現在、実際には WTForms でフォームを個別に定義しているのではなく、Flask-MongoEngine に含まれている魔法を使用しているだけなので、私の最初の試みは、マクロにロジックを追加し、a{% elif field.type == 'ListField' %}を追加して、含まれているものを発見することです。そこを繰り返してフォームを生成します。ソースコードをざっと見てみると、次のようなものがうまくいくかもしれません。

{% elif field.type == 'ListField %}
    {# render_the_group_label #}
    {% for subfield in field.entries %}
        {% if subfield.type == 'StringField' %}
            {# render_the_subfield #}
        {% endif %}
    {% endfor %}
...

そのコードに取り組む必要がありますが、うまくいけば、正しい方向に向けることができます. それ以外の場合は、WTForms でフォームを個別に定義して、コード側でもう少し制御できるようにします。幸いなことに、そのルートに進む必要がある場合に役立つ csv タグの例が提供されています。同様の効果を実現するためにデコレーターを使用して別のルートを取るガイドを書きました。@property

于 2013-08-02T13:52:57.357 に答える