Flask - кнопка «Отправить» отправляет все формы вместо одной формы - PullRequest
0 голосов
/ 27 октября 2018

Я использую две формы на одной из моих страниц, одну для закрытия тикетов и одну для отправки ответов.Но проблема в том, что когда я отправляю одну из них, отправляется и другая!и показывает флэш-массажи.Итак, у меня есть два мгновенных массажа!Это становится более сложным, так как я проверяю некоторые условия, чтобы показать первую форму, и в этом случае, что эта форма даже не повторяется, у меня есть два мгновенных массажа!

@app.route('/edit-ticket', methods=['GET', 'POST'])
def edit_ticket():
if session['logged_in'] == True:
    trackingNumberLink = int(request.args.get('trackingNumber'))
    closeForm = CloseTicket()
    editForm = EditTicket()
    GetTicketStatus = tickets.find_one({"trackingNumber": trackingNumberLink})
    if closeForm.validate_on_submit():
        tickets.update_one({"trackingNumber": trackingNumberLink},
                           {"$set": {"status": "پاسخ داده شده", "order": 2}})
        flash(u"تیکت مورد نظر با موفقیت بسته شد.")
    if editForm.validate_on_submit():
        replyDate = jdatetime.datetime.now()
        tickets.update_one({"trackingNumber": trackingNumberLink},
                           {"$set": {"status": "در حال بررسی", "order": 1}})
        tickets.update_one({"trackingNumber": trackingNumberLink},
                           {"$push": {"replies": {"rep": {"mass": editForm.ticketMassage.data,
                                                          "date": replyDate.strftime("%H:%M:%S %d-%m-%y "),
                                                          "HowSent": "user"}}}})
        flash(u"پاسخ با موفقیت ارسال شد.")
    return render_template('edit-ticket.html', Title="ویرایش تیکت", closeForm=closeForm,
                           editForm=editForm, CanUserCloseTicket=GetTicketStatus)
else:
    return redirect(url_for('Login'))

HTML:

{% extends "layout.html" %}
{% block content_main %}
<div class="container content-box">
    <div class="row">
        <div class="col-sm-12">
            <div class="FormSection center-form">
                <fieldset class="form-group">
                    <legend class="border-bottom mb-4">ویرایش تیکت</legend>
                </fieldset>
                <form method="post" action="">
                    {{ editForm.hidden_tag() }}
                    <div class="form-group">
                        {{ editForm.ticketMassage.label(class="form-control-label") }}
                        {% if editForm.ticketMassage.errors %}
                            {{ editForm.ticketMassage(class="form-control-lg is-invalid") }}
                            <div class="invalid-feedback">
                                {% for error in editForm.ticketMassage.errors %}
                                    <span>{{ error }}</span>
                                {% endfor %}
                            </div>
                        {% else %}
                            {{ editForm.ticketMassage(class="form-control-lg") }}
                        {% endif %}
                    </div>
                    <div class="form-group">
                        {{ editForm.submit(class="btn btn-outline-info") }}
                    </div>
                </form>
            </div>
            {% if CanUserCloseTicket['status'] != "پاسخ داده شده" %}
                <div class="FormSection center-form">
                    <form method="post" action="">
                        {{ closeForm.hidden_tag() }}
                        <div class="form-group">
                            {{ closeForm.submitCloseTicket(class="btn btn-outline-info") }}
                        </div>
                    </form>
                </div>
            {% endif %}
        </div>
    </div>
</div>
</div>
{% endblock content_main %}

Класс бланков:

class EditTicket(FlaskForm):
    ticketMassage = TextAreaField('متن پیام:',
                              description=u'پاسخ خود را بنویسید.',
                              validators=[data_required(), Length(min=20, max=500)], )
    submit = SubmitField('ویرایش تیکت')


class CloseTicket(FlaskForm):
    submitCloseTicket = SubmitField('بستن تیکت')

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Поместите действие в свои формы вместо того, чтобы оставить его пустым:

<form method="post" action="/close-ticket"> ... </form>

<form method="post" action="/edit-ticket"> ... </form>

Определите явные функции для обработки каждого действия.Одно действие, одна функция - будь проще.Выделите и повторно используйте логику входа в систему для каждого.

@app.route('/close-ticket', methods=['POST'])
def close_ticket():
    if session['logged_in'] != True:
        return redirect(url_for('Login'))
    # closeForm handling, etc....

@app.route('/edit-ticket', methods=['POST'])
def edit_ticket():
    if session['logged_in'] != True:
        return redirect(url_for('Login'))
    # editForm handling, etc....
0 голосов
/ 27 октября 2018

Визуализируйте тег формы с атрибутом id, а для тегов submit и input используйте атрибут формы.

<form id="edit-ticket">
    {{ form.submit(form="edit-ticket") }}

Элемент формы, с которым связан элемент ввода (его владелец формы),Значение атрибута должно быть идентификатором элемента в том же документе.Если этот атрибут не используется, элемент ассоциируется с ближайшим элементом-предком, если таковой имеется.Этот атрибут позволяет размещать элементы в любом месте документа, а не только как потомки элементов формы.

Обновление Используйте разные имена для submit, чем в вашем views.py if close_form.validate_on_submit() and close_form.close.data:

from flask import Flask, render_template
from flask_wtf import FlaskForm, CSRFProtect
from wtforms.fields import SubmitField, TextAreaField

app = Flask(__name__)


app.config['SECRET_KEY'] = '^%huYtFd90;90jjj'
app.config['UPLOADED_FILES'] = 'static/files'


csrf = CSRFProtect(app)


class EditTicketForm(FlaskForm):
    ticket_message = TextAreaField()
    edit = SubmitField()


class CloseTicketForm(FlaskForm):
    message = TextAreaField()
    close = SubmitField()


@app.route('/edit-ticket', methods=['GET', 'POST'])
def edit_ticket():
    close_form = CloseTicketForm()
    edit_form = EditTicketForm()
    if close_form.is_submitted() and close_form.close.data:
        if close_form.validate():
            x = close_form.message.data
            return x.upper()
    if edit_form.is_submitted() and edit_form.edit.data:
        if edit_form.validate():
            y = edit_form.ticket_message.data
            return y.upper()
    return render_template('edit-ticket.html', close_form=close_form, edit_form=edit_form)


if __name__ == "__main__":
    app.run(debug=True)

edit-ticket.html

<form method="post" id="edit-form" novalidate></form>
<form method="post" id="close-form" novalidate></form>
    {{ edit_form.csrf_token(form="edit-form") }}
    {{ close_form.csrf_token(form="close-form") }}
    {{ edit_form.ticket_message(form="edit-form") }}
    {{ edit_form.edit(form="edit-form") }}
    {{ close_form.message(form="close-form") }}
    {{ close_form.close(form="close-form") }}
...