4

次のようにフォーム エラーを処理するマクロを作成しました。

    {% macro render_field_with_errors(field) %}
       <p> 
          {{ field.label }} {{ field(**kwargs)|safe }}
          {% if field.errors %}
             <ul>
                  {% for error in field.errors %}
                     <li style="color: red;">{{ error }}</li>
                  {% endfor %}
            </ul>
          {% endif %}
       </p>
    {% endmacro %}

{% macro render_field(field) %}
   <p>{{ field(**kwargs)|safe }}</p>
{% endmacro %}

私のforms.pyは次のとおりです:

from flask.ext.wtf import Form, TextField, BooleanField, PasswordField, RadioField, SelectMultipleField
from flask.ext.wtf import Required

class LoginForm(Form):
    username = TextField('email', validators = [Required()])
    password = PasswordField('password', validators=[Required()])
    remember_me = BooleanField('remember_me', default = False)

私のログインフォームは次のとおりです。

<!-- Login form -->
{% from "includes/_formhelpers.html" import render_field_with_errors %}
<form method="POST" action="/login" focus="first">
        <div class="span5">
                {{ login_form.hidden_tag() }}
                {{ render_field_with_errors(login_form.username(placeholder="Username / Email", class="span10")) }}
                <br>
                 {{ render_field_with_errors(login_form.password(placeholder="Password", class="span10")) }}
                 <br>
                 <div class="qp-log">
                     {{ render_field_with_errors(login_form.remember_me(class="qp-login", value="remember_me")) }} Remember Me
                     <br>
                     <button type="submit" class="btn qp-btn" style="height:30px;width:56px;">Login</button>
                     <button type="Reset" class="btn">Clear</button>
                 </div>
                 <div class="qp-pass">
                     Forgot Password? <a href ="#">click here</a>
                 </div>
        </div>
<div class="span2">
              <br>
              <br>
              <br> &nbsp;
              <img src="{{ url_for('static', filename='img/or_icon.gif') }}">
        </div>
        <div class="span5">
            <center>
                <br>
                <button class="btn btn-facebook">
                        <small>Connect with</small>
                        <big>  Facebook </big>
                </button>
                <h4> or </h4>
                <button type="Submit" class="btn qp-btn">
                        <a href="signup.html" style="color:white;">Sign Up for Free</a>
                </button>
            </center>
       </div>
</form>
<!-- Form End -->

次のエラーが表示されます:

Traceback (most recent call last):
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/rahul/git/webapp/webapp/routes.py", line 14, in index
    return render_template("public/index.html", login_form=login_form)#, registration_form=registration_form)
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/templating.py", line 125, in render_template
    context, ctx.app)
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/flask/templating.py", line 107, in _render
    rv = template.render(context)
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/jinja2/environment.py", line 969, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/rahul/git/webapp/venv/lib/python2.7/site-packages/jinja2/environment.py", line 742, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/rahul/git/webapp/webapp/templates/public/index.html", line 1, in top-level template code
    {% extends "public/base.html" %}
  File "/home/rahul/git/webapp/webapp/templates/public/base.html", line 1, in top-level template code
    {% extends 'layout.html' %}
  File "/home/rahul/git/webapp/webapp/templates/layout.html", line 35, in top-level template code
    {% block content %}{% endblock %}
  File "/home/rahul/git/webapp/webapp/templates/public/index.html", line 4, in block "content"
    {% include 'public/login.html' %}
  File "/home/rahul/git/webapp/webapp/templates/public/login.html", line 6, in top-level template code
    {{ render_field_with_errors(login_form.username(placeholder="Username / Email", class="span10")) }}
  File "/home/rahul/git/webapp/webapp/templates/includes/_formhelpers.html", line 3, in template
    {{ field.label }} {{ field(**kwargs)|safe }}
AttributeError: 'HTMLString' object has no attribute '__call__'

コードで何が間違っているのですか?HTML ファイルからマクロを削除し、代わりにエラー処理用の for ループを HTML 形式で含めると、完全に機能します。私が思うに、エラーの原因となる要素に含まれるプレースホルダーとクラスですが、その理由はわかりませんか?

4

1 に答える 1

15

私は最近同様の問題を抱えていました。問題はlogin.html内のこのパターンにあると思います

 {{ render_field_with_errors(login_form.password(placeholder="Password", class="span10")) }}

プレースホルダーとクラスをログイン フォームに渡しています。この時点では、wtf によって生成された html の一部です。私のバージョンのフラスコでこれを試してみると、残りのコードが異なっていてもまったく同じエラーが発生します。ヘルパー内でプレースホルダーとクラスを渡すと、エラーはなくなりました:

{{ field(class="span10",placeholder="Password",**kwargs)|safe }}

ヘルパーで一般的なプレースホルダーとクラスを渡すことができない場合は、テンプレート内でいつでも指定できます

<div class=span10> {{render_field_with_errors(loginForm.password) }} </div>

更新:実際に私はこれをもう一度チェックアウトしましたが、次のようにすることもできます:

{{ render_field_with_errors(login_form.password,placeholder="Password", class="span10") }}

これは理にかなっています-キーワード引数をフィールドに渡しています。処理できない引数を持つ関数を渡すのではなく、いくつかのキーワード引数だけを渡します。お役に立てれば。

于 2013-08-09T10:13:52.110 に答える