3

我正在为一个项目使用 Flask,mongoengine,我试图从http://docs.mongodb.org/manual/tutorial/write-a-tumblelog-application-with-flask-mongoengine/获得基本的东西

在实现上述链接中的所有内容后,我在 Post 中为“标签”添加了一个新字段,当我尝试创建帖子时,我的标签没有显示输入框。

任何帮助表示赞赏。

我的代码和截图如下

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文档,它似乎ListField就像WTForms 所指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 回答