FlaskForm не проверяется при отправке

#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: без ()