0

(Flask、Python、Jinja2 を使用して) ユーザー登録関数を作成しています。これは、ユーザー名 (または電子メール) が既に存在するかどうかを確認し、存在する場合は TextField の下にエラーを表示します。

登録コードは次のとおりです。

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = SignupForm()
    error = None
    if form.validate_on_submit():
      user_by_name = Users.query.filter_by(username=form.username.data).first()
      user_by_email = Users.query.filter_by(email=form.email.data).first()
      if user_by_name:
        error = 'Username already taken. Choose another'
        return render_template('register.html', form=form, error = error)
      elif user_by_email:
        error = 'Email already registered. Login or register with another Email'
        return render_template('register.html', form=form, error = error)
      else:
         #Add user details to DB logic
          return redirect(url_for('index'))
    return render_template('register.html', form=form, error = error)

ファイルに定義されたマクロがありますutil.html

    {% macro render_field(field) %}
    <div class="control-group {% if field.errors %}error{% endif %}">
        {% if kwargs.get('label', True) %}
            {{ field.label(class="control-label") }}
        {% endif %}
        <div class="controls">
            {{ field(**kwargs) }}
            {% for error in field.errors %}
                <p class="help-block">{{ error }}</p>
            {% endfor %}
        </div>
    </div>
   {% endmacro %}

このマクロを次のように使用しregister.htmlます。

{% from "util.html" import render_field %}

{% extends "base.html" %} 

{% block content %}
    <form method="post">
        {{ form.hidden_tag() }}
        {{ render_field(form.username, label=True, class="input-xlarge", autofocus="autofocus", errors=error) }}
        {{ render_field(form.password, label=True, class="input-xlarge", autofocus="autofocus") }}
        {{ render_field(form.confirm, label=True, class="input-xlarge", autofocus="autofocus") }}
        {{ render_field(form.email, label=True, class="input-xlarge", autofocus="autofocus", errors=error) }}        

        <button class="btn" type="submit">Register</button>
    </form>
{% endblock %}

localhost:5000/register重複したユーザー名または電子メールアドレスを使用してテストすると、エラーはまったく表示されません (DB にユーザーを追加することもありません)。しかし、間違った電子メールを入力したり、フィールドを空白のままにしたりすると、それぞれが表示されますが、ビューを使用して渡したいものerrorは表示されません。errorregister

Jinja2 関連のロジックが欠落していませんか?

そして、なぜそれerrorsが空白のフィールドまたは間違ったものに関連して表示されているのに、重複などemailを渡そうとしているのか.username

提案してください。

4

2 に答える 2

0

次のサンプル コード ファイルのようにエラーをフラッシュするだけです: views.py

@app.route('/')
def index():
    # some checks which provided error        
    if error:
        flash(error)
    return render_template('template.html')

ファイル template.html

{% for category, msg in get_flashed_messages(with_categories=true) %}
    <div class="category">{{ msg|safe }}</div>
{% endfor %}
于 2015-03-23T19:12:03.630 に答える