ListField показывает ‹ul› вместо ‹input› при редактировании/создании сообщения

Я использую 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 %}

person pbathala    schedule 29.07.2013    source источник
comment
Пожалуйста, не могли бы вы опубликовать код wtf, который вы использовали для определения формы? Ваша проблема не в определении вашей модели, а в форме и в том, как эта форма отображается, поэтому код для этого важен.   -  person Doobeh    schedule 01.08.2013
comment
Пожалуйста, найдите обновленный код формы wtf   -  person pbathala    schedule 01.08.2013


Ответы (1)


Из того, что я могу понять, ваша проблема в том, что вы говорите WTF отображать поле тегов, но WTForms не знает, как обрабатывать эту информацию.

Глядя на документацию Flask-MongoEngine, кажется, что ListField — это просто FieldList как WTForms ссылается на него.

В настоящее время вы фактически не определяете форму независимо в WTForms, вы просто используете магию, включенную в Flask-MongoEngine, поэтому моей первой попыткой было бы добавить еще немного логики в ваш макрос, добавить {% 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 для достижения аналогичного эффекта, что, опять же, может, по крайней мере, указать вам на финишную черту.

person Doobeh    schedule 02.08.2013