2

Google App Engine で WTForm model_form を使用して表示するフォームを取得します。/admin/newpost にアクセスすると、フィールドが表示されることを期待しています

私のモデル

class BlogPost(db.Model):
    #The URL path to the blog post. Posts have a path if they are published.
    path = db.StringProperty()
    title = db.StringProperty(required=True, indexed=False)
    body = db.TextProperty(required=True)
    published = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)

私のPostHandler

class PostHandler(webapp2.RequestHandler):

@webapp2.cached_property
def jinja2(self):
    return jinja2.get_jinja2(app=self.app)

def render_to_response(
    self,
    template_name,
    template_vals=None,
    theme=None
    ):
    template_name = "admin/%s" % template_name
    self.response.out.write(render_template(
        template_name, template_vals, theme))

def render_form(self, form):
    self.render_to_response("edit.html", {'form': form()})

def get(self):
    form = model_form(BlogPost)
    self.render_form(form)

機能しない Edit.html テンプレート

{% extends "base.html" %}
{% block title %}New Post{% endblock %}
{% block body %}
  <form method="post" action="">
    <table>
      {{form}}
    </table>
    <input type="submit" />
  </form>
{% endblock %}

このテンプレートを使用すると、フォーム ボタンのある html が表示されます。問題は、モデル フィールドが表示されないことです。フィールドを表示するには、これを行う必要があります...

機能する Edit.html テンプレート

{% extends "base.html" %}
{% block title %}Testing New Post Template{% endblock %}
{% block body %}
  <form method="post" action="">
    <table>

<div>{{ form.title.label }}: {{ form.title(class="css_class") }}</div>
{% if form.title.errors %}
        <ul class="errors">{% for error in form.name.errors %}<li>{{ error }}</li>{% endfor %}</ul>
    {% endif %}

<div>{{ form.body.label }}: {{ form.body() }}</div>
{% if form.body.errors %}
        <ul class="errors">{% for error in form.body.errors %}<li>{{ error }}</li>{% endfor %}</ul>
    {% endif %}

    </table>
    <input type="submit" />
  </form>
{% endblock %}

要するに、フォームにモデル フィールドを表示する最初のバージョンを取得するにはどうすればよいですか?

4

1 に答える 1

1

WTForms.Form をサブクラス化して、__html__すべてのサブフィールドを反復処理して返すメソッドを提供できます。

class CustomForm(Form):
    def __html__(self):
        fields = [u"%s %s" % (field.label, field) for field in self.fields]
        return Markup(u"".join(fields))

または、Jinja でマクロを作成してフォームをレンダリングすることもできます (見たい場合は、ここに例があります)。

于 2012-08-07T04:58:45.540 に答える