Множественные проверки flask-wtf в одном HTML-шаблоне
Мое первое веб-приложение и попытка фляги, jinja2, wtforms и т. Д. Я искал ответ, но у меня не получается. Я пытаюсь создать шаблон с двумя отдельными формами, каждая из которых имеет уникальные требования проверки. Проблема, с которой я сталкиваюсь, заключается в том, что даже если я отправлю только одну форму, другая форма вернет пользователю ошибки проверки. Я хочу иметь возможность использовать обе формы независимо друг от друга и не иметь ошибок проверки на одной, в то время как другая работает. Обе формы работают в настоящее время, но не когда они используют один и тот же шаблон.
Настой:
# Main Customer Page
@app.route('/customers/', methods=['GET', 'POST'])
@login_required
def customers():
error = None
customer_form = AddCustomerForm(request.form)
address_form = AddAddressForm(request.form)
if request.method == "POST":
if customer_form.validate_on_submit():
add_customer = Customer(
customer_form.name.data,
customer_form.email.data,
customer_form.telephone.data
)
db.session.add(add_customer)
db.session.commit()
flash('New customer was successfully added')
if address_form.validate_on_submit():
add_address = Address(
address_form.street.data,
address_form.city.data,
address_form.state.data,
address_form.zip.data
)
db.session.add(add_address)
db.session.commit()
flash('New Address was successfully added')
return render_template('customers.html', customer_form=customer_form, address_form=address_form, error=error)
Шаблон:
{% extends "_base.html" %}
{% block content %}
<h4>Add New Customer</h4>
<form class="form-signin" role="form" method="post" action="/customers/">
{{ customer_form.csrf_token }}
{{ customer_form.name(placeholder="customer name") }}
<span class="error">
{% if customer_form.name.errors %}
{% for error in customer_form.name.errors %}
{{ error }}
{% endfor %}
{% endif %}
</span>
{{ customer_form.telephone(placeholder="telephone number") }}
<span class="error">
{% if customer_form.telephone.errors %}
{% for error in customer_form.telephone.errors %}
{{ error }}
{% endfor %}
{% endif %}
</span>
{{ customer_form.email(placeholder="email address") }}
<span class="error">
{% if customer_form.email.errors %}
{% for error in customer_form.email.errors %}
{{ error }}
{% endfor %}
{% endif %}
</span>
<button class="btn btn-sm btn-success" type="submit">Create</button>
</form>
<form class="form-signin" role="form" method="post" action="/customers/">
{{ address_form.csrf_token }}
<br>
<h4>Add Address</h4>
{{ address_form.priority }}
{{ address_form.street(placeholder="street") }}
<span class="error">
{% if address_form.street.errors %}
{% for error in address_form.street.errors %}
{{ error }}
{% endfor %}
{% endif %}
</span>
{{ address_form.city(placeholder="city") }}
<span class="error">
{% if address_form.city.errors %}
{% for error in address_form.city.errors %}
{{ error }}
{% endfor %}
{% endif %}
</span>
{{ address_form.state(placeholder="state abbreviation") }}
<span class="error">
{% if address_form.state.errors %}
{% for error in address_form.state.errors %}
{{ error }}
{% endfor %}
{% endif %}
</span>
{{ address_form.zip(placeholder="zip") }}
<span class="error">
{% if address_form.zip.errors %}
{% for error in address_form.zip.errors %}
{{ error }}
{% endfor %}
{% endif %}
</span>
<button class="btn btn-sm btn-success" type="submit">Add</button>
</form>
<br>
<h2>Search Customers</h2>
{% endblock %}
Проверка формы:
class AddCustomerForm(Form):
name = StringField('Username', validators=[DataRequired()])
email = StringField('Email', validators=[Email()])
telephone = StringField('Telephone', validators=[DataRequired(), Length(min=10, max=10)])
class AddAddressForm(Form):
names = [(0, "Select Customer")]
for k in customer_names():
names.append((k.id, k.name))
priority = SelectField(
'Select Customer', # this is the name of the field
validators=[DataRequired()],
choices=names)
street = StringField('Street', validators=[DataRequired()])
city = StringField('City', validators=[DataRequired()])
state = StringField('State', validators=[DataRequired(), Length(min=2, max=2)])
zip = StringField('Zip', validators=[DataRequired(), Length(min=5, max=5)])
1 ответ
Самый простой способ сделать это - добавить имя и значение в кнопки отправки и проверить значение в вашем обработчике:
<button ... name="action" value="add-customer">Create</button>
<button ... name="action" value="add-address">Add</button>
А в вашем обработчике просто проверьте значение request.form["action"]
параметр:
if request.method == "POST":
if request.form.get("action") == "add-customer":
# Add a customer
elif request.form.get("action") == "add-address":
# Add an address