Форма Flask WTForms не отправляется, но не выводит ошибок проверки

Я пытаюсь создать базовый пакет бухгалтерского учета с помощью Flask, и я немного застрял с проверкой конкретной формы. Он работает для другой формы в том же приложении, но по какой-то причине я не могу понять, почему эта тоже не работает. Форма отображается в веб-браузере так, как должна, и я могу вводить данные как обычно, но когда я прихожу, чтобы отправить форму, она просто перезагружает страницу. Моя база данных не обновляется, и после некоторых копаний я обнаружил, что мой if form.validate_on_submit() ничего не ловит.

В трассировке стека также нет ошибок.

Я опубликую соответствующие разделы моих файлов ниже.

My views.py:

@app.route('/dashboard/<nickname>/work-orders/add/', methods = ['GET', 'POST'])
@login_required
def work_orders_add(nickname):
ca = check_active(nickname)
if ca[1] == True:
    form = AddWorkOrderForm()
    u = User.query.get(current_user.id)
    c = u.contacts.order_by('name').all()
    form.requestor.choices = [(contact, contact.name) for contact in c]
    if form.validate_on_submit():
        db.session.add(WorkOrder(requestor = form.requestor.data,
            date = form.date.data,
            notes = form.notes.data,
            total = 0.00,
            completed = form.completed.data,
            user = g.user))
        db.session.commit()
        return redirect(url_for('work_orders', nickname=current_user.nickname))
    elif request.method != "POST":
        form.date.data = datetime.date.today()
    else: return "didn't work" 
    return render_template('work_orders_add.html',
        user = ca[0],
        title = "New Work Order",
        form = form)
else: return redirect(url_for('work_orders', nickname=current_user.nickname))

My forms.py:

class AddWorkOrderForm(Form)
    requestor = SelectField('requestor', coerce=unicode)
    date = DateField('date')
    notes = TextAreaField('notes')
    completed = BooleanField('completed', default = False)

My models.py:

class WorkOrder(db.Model):
    __tablename__ = 'workorder'
    id = db.Column(db.Integer, primary_key = True)
    date = db.Column(db.String(64))
    notes = db.Column(db.String(1024))
    total = db.Column(db.Float)
    completed = db.Column(db.Boolean)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    contact_id = db.Column(db.Integer, db.ForeignKey('contact.id'))
    items = db.relationship('WorkOrderItem', primaryjoin="WorkOrder.id==WorkOrderItem.work_order_id", backref = 'order')

    def __repr__(self):
        return '<WorkOrder %r>' % (self.id)

Мой HTML-файл:

{% extends "_is_logged.html" %}
{% block content %}
<h1>{{ title }}</h1>
<form action="" method="post" name="work_order">
    {{ form.hidden_tag() }}
    <p>Requestor: {{ form.requestor() }}</p>
    <p>Date: {{ form.date() }}</p>
    <p>Notes: {{ form.notes(size=70) }}</p>
    <p>Completed: {{ form.completed() }}</p>
    <p><input type="submit" value="Add Work Order"></p>
</form>
{% endblock %}

Спасибо.


person LJPPython    schedule 18.01.2014    source источник
comment
Что произойдет, если вы добавите {% for field_name, field_errors in form.errors.items() %}<p>{{ field_name }} <ul>{% for error in field_errors %}<li>{{ error }}</li>{% endfor %}</ul>{% endfor %}</p> в файл шаблона?   -  person Sean Vieira    schedule 19.01.2014
comment
Я пытался добавить это, но, похоже, ничего не изменилось. Нужно ли вообще менять ваш код, но помещать его в мой файл шаблона? Или должно было сработать простое копирование и вставка?   -  person LJPPython    schedule 19.01.2014
comment
Нет, это должно было сработать, если вы поместили его в блок content...   -  person Sean Vieira    schedule 19.01.2014
comment
Дважды проверенный; он был внутри блока content, но, к сожалению, ничего не производит.   -  person LJPPython    schedule 19.01.2014
comment
Все еще не исправлено, если кто-то может помочь. Спасибо.   -  person LJPPython    schedule 20.01.2014
comment
Что произойдет, если вы поместите операторы print в каждый из ваших блоков - пойдет ли он туда, куда вы ожидаете? (А что будет, если перед return render_template поставить print "Form Errors:", form.errors?   -  person Sean Vieira    schedule 20.01.2014
comment
вы используете HTML5? В этом случае форма не будет отправлена ​​из-за <form action="" Спецификация HTML5 требует непустого атрибута действия.   -  person larissa    schedule 14.08.2014
comment
Попробуйте напечатать form.errors и request.method методом work_orders_add!   -  person Prakash Pandey    schedule 11.06.2015


Ответы (1)


Думаю, @Iarissa давно это заметила. Форма не имеет значения действия, поэтому в качестве первого шага я предлагаю вам изменить это:

<form action="" method="post" name="work_order">

в:

<form action="{{url_for('work_orders_add')}}" method="POST" name="work_order">

Также из приведенного кода видно, что функция work_orders_add(nickname) не имеет правильного отступа. Оператор if должен быть включен в функцию, чтобы у вас было:

@app.route('/dashboard/<nickname>/work-orders/add/', methods = ['GET', 'POST'])
@login_required
def work_orders_add(nickname):
    ca = check_active(nickname)
    if ca[1] == True:
        form = AddWorkOrderForm()
        u = User.query.get(current_user.id)
        c = u.contacts.order_by('name').all()
        form.requestor.choices = [(contact, contact.name) for contact in c]
        if form.validate_on_submit():
person ciacicode    schedule 30.07.2015