#python #forms #flask #flask-wtforms
#python #формы #flask #flask-wtforms
Вопрос:
Я что-то упустил? Или, может быть, я неправильно выбираю параметры выбора поля? У меня добавлен токен CSRF, и после нажатия кнопки отправки он просто очищает данные, но не выдает ошибок. Что я заметил, так это то, что он никогда не попадает внутрь оператора if if form.validate_on_submit():
Вот мой forms.py
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect
from wtforms import StringField, TextAreaField, DateField, IntegerField
from wtforms.validators import DataRequired
csrf = CSRFProtect()
class NewAccount(FlaskForm):
account_field = StringField("Dealership Name:", validators=[DataRequired()])
rep_field = StringField("Sales Rep:", validators=[DataRequired()])
group_field = StringField("Group:", default ="n/a")
price_field = IntegerField("Price:", validators=[DataRequired()])
setup_field = IntegerField("Setup:", validators=[DataRequired()])
signed_field = DateField("Signed Date(MM/DD/YYYY):",
format='%m/%d/%Y',validators=[DataRequired()])
commitment_field = StringField("Commitment:", validators=[DataRequired()])
payment_field = StringField("Payment Type:", validators=[DataRequired()])
vertical_field = StringField("Vertical:",validators=[DataRequired()])
Вот моя проверка при отправке:
@app.route('/new_account', methods=('GET', 'POST'))
def add():
"""create new account"""
form = forms.NewAccount()
if form.validate_on_submit():
models.MasterLog.create(account_name=form.account_field.data,
sales_rep=form.rep_field.data,dealer_group=form.group_field.data,
price=form.price_field.data,setup=form.setup_field.data,
signed_on=form.signed_field.data,commitment=form.commitment_field.data,
payment_type=form.payment_field.data,vertical=form.vertical_field.data)
flash("Account Added! Thanks!", "success")
return redirect(url_for('active'))
else:
print("An error occured")
return render_template('new.html', form=form)
Вот HTML-форма:
{% extends "layout.html" %}
{% from 'macros.html' import render_field %}
{% block content %}
<div class="new-entry">
<div class="form-style-8">
<h2>New Account</h2>
<form method='POST' action=''>
{% for field in form %}
{{ form.hidden_tag() }}
{% if field.name != 'csrf_token' %}
{{ field.label() }}
{% endif %}
{% if field.name == 'rep_field' %}
<select id="reps" name="reps">
<option value="Dan">Dan</option>
<option value="Danielle">Danielle</option>
<option value="Hal">Hal</option>
<option value="Hessam">Hessam</option>
<option value="Jessica">Jessica</option>
<option value="Travis">Travis</option>
</select>
{% elif field.name == 'commitment_field' %}
<select id="commitment" name="commitment">
<option value="Anually">Anually</option>
<option value="Quarterly">Quarterly</option>
<option value="6 Months">6 Months</option>
<option value="Monthly">Monthly</option>
</select>
{% elif field.name == 'payment_field' %}
<select id="payment" name="payment">
<option value="Pay As You Go">Pay As You Go</option>
<option value="Advanced Payment">Advanced Payment</option>
</select>
{% elif field.name == 'vertical_field' %}
<select id="vertical" name="vertical">
<option value="Franchise">Franchise</option>
<option value="Independent">Independent</option>
<option value="Sokal">Sokal</option>
<option value="PowerSport">Powersport</option>
</select>
{% elif field.name =='price_field' %}
{{field(value='$')}}
{% elif field.name =='setup_field' %}
{{field(value='$')}}
{% elif field.name =='signed_field' %}
{{field(type='date')}}
{% else %}
{{ render_field(field) }}
{% endif %}
{% endfor %}
<div class="button-section">
<button type="submit" id="submit" class="button">Add</button>
<button class="button" onclick="document.location='active'">Cancel</button>
</div>
</form>
</div>
</div>
</div>
{% endblock %}
Вот мои модели:
from peewee import *
import csv
import datetime
DATABASE = SqliteDatabase('Master.db')
class MasterLog(Model):
id = AutoField()
timestamp = DateTimeField(default=datetime.datetime.now, null=True)
account_name = CharField(max_length=200, unique=True)
sales_rep = CharField(max_length=200, unique=False)
dealer_group = CharField(max_length=200, unique=False)
price = IntegerField(null=True)
setup = IntegerField(null=True)
signed_on = DateTimeField(null=True)
integrated_on = DateTimeField(null=True)
billable_on = DateTimeField(null=True)
commitment = CharField(max_length=200, unique=False)
payment_type = CharField(max_length=200, unique=False)
billing_method = CharField(max_length=200, unique=False, null=True)
kick_off = CharField(max_length=200, unique=False, null=True)
last_visit = DateTimeField(null=True)
vertical = CharField(max_length=200, unique=False)
notes = CharField(max_length=200, unique=False, null=True)
cancelled_on = DateTimeField(null=True)
class Meta:
database = DATABASE
Ответ №1:
Изменить
{{ form.hidden_tag() }}
Для
{{ form.csrf_token }}
Комментарии:
1. К сожалению, та же проблема. Он перенаправляет на ту же страницу и пропускает проверку при отправке. Я думаю, что это мой выбор / параметры. Работал нормально, пока я не добавил их..
2. Выглядит ли сгенерированный HTML-код разумным? (Переместите
{{ form.csrf_token }}
выше цикл, чтобы он появлялся только один раз.3. у меня возникла эта проблема, и оказалось, что мне нужно добавить средство
Optional()
проверки в поля формы, которые я оставлял пустыми, напримерthis_field = FloatField('my float', validators=[Optional()])
Ответ №2:
У меня была такая же проблема, я сделал две вещи, чтобы решить эту проблему.
Во-первых, я добавил необязательный () валидатор в поля формы, которые я оставлял пустыми, например field = StringField('string', validators=[Optional()])
А затем измените строку
if form.validate_on_submit():
чтобы if form.validate_on_submit:
без ()