Добавьте кнопку отмены во Flask с помощью Flask-WTF / WTForms
Я хотел бы добавить кнопку отмены, которая возвращает на предыдущую страницу. Мой код: forms.py:
from flask_wtf import Form
from wtforms import StringField, HiddenField, SubmitField
from wtforms.validators import DataRequired, Length, ValidationError
def _required(form, field):
if not field.raw_data or not field.raw_data[0]:
raise ValidationError('Field is required')
class OrganisationForm(Form):
id = HiddenField('id', default="-1")
name = StringField('name', validators=[DataRequired()])
manager_name = StringField('manager_name')
address = StringField('address', validators=[DataRequired()])
city = StringField('city', validators=[DataRequired()])
postal_code = StringField('postal_code', validators=[DataRequired(), Length(max=16)])
province = StringField('province', validators=[Length(max=2, message="Can't exceed 2 characters")])
country = StringField('country', validators=[DataRequired()])
submit = SubmitField('Add')
cancel = SubmitField('Cancel')
и страница шаблона:
{% block content %}
<div class="content-section">
{{ utils.flashed_messages() }}
<div class="center">
{% if add_orgnisation %}
<h1>add an organisation</h1>
{% else %}
<h1>Edit an organisation</h1>
{% endif %}
<br/>
<br/>
{{ wtf.quick_form(form,novalidate=True) }}
</div>
</div>
{% endblock %}
просмотров, ру
@orgs.route('/organisations/org_new')
@login_required
def org_new():
add_orgnisation = True
form = OrganisationForm()
return render_template("organisations/organisation_form.html", form=form, title="New Organisation", edit=False, add_orgnisation=add_orgnisation)
Когда я нажимаю кнопку отмены, появляется ошибка 405: метод запрещен.
В чем моя ошибка? и что мне добавить, чтобы вернуться на предыдущую страницу, когда я нажимаю «Отмена»?
Благодарность
Ответы
Нет, я использую TimeField, чтобы обеспечить фиксацию действительного времени. Я не пытался заменить его на обычное текстовое поле, поэтому вместо этого выбрал опцию «Отменить». Я все же предпочитаю иметь кнопку «Отмена».
Когда я нажимаю кнопку отмены, появляется ошибка 405: метод запрещен. В чем моя ошибка?
Когда вы отправляете форму, данные будут отправлены как запрос POST (поскольку будет использоваться отображаемый элемент формы <form method="post">
). Однако ваша функция просмотра по умолчанию разрешает только запрос GET, чтобы принять запрос POST, вы должны указать methods
параметр следующим образом:
@orgs.route('/organisations/org_new', methods=['GET', 'POST']) # <--
@login_required
def org_new():
# ...
и что мне добавить, чтобы вернуться на предыдущую страницу, когда я нажимаю «Отмена»?
Любое поле, созданное с помощью, SubmitField
будет отображаться как кнопка отправки ( <input type="submit">
), поэтому форма будет отправлена при нажатии на нее.
Чтобы вернуться на предыдущую страницу при нажатии кнопки отмены, обычно есть два метода для этого:
1. Поймайте кнопку "Отправить" в функции просмотра.
Как и метод в ответе Бена . Вы можете просто поймать отправку и перенаправить пользователя на предыдущую страницу:
@orgs.route('/organisations/org_new', methods=['GET', 'POST'])
@login_required
def org_new():
if request.method == 'POST':
if form.cancel.data: # if cancel button is clicked, the form.cancel.data will be True
return redirect(url_for('previous_page_view_name'))
# ...
PS Так как вы уже установили novalidate=True
в wtf.quick_form
, вам не нужно устанавливать render_kw={'formnovalidate': True}
на cancel
кнопки в классе формы.
2. Создайте <a>
кнопку вместо cancel
поля.
Вы можете создать обычный <a>
элемент как кнопку отмены ( class="btn btn-secondary"
) и заполнить href
параметр URL-адресом предыдущей страницы (тогда вам не нужно добавлять cancel
поле в свой класс формы). Таким образом, вы не можете использовать wtf.quick_form()
, вместо этого вам нужно будет визуализировать каждое поле вручную с помощью wtf.form_field()
:
<form method="post">
{{ wtf.form_field(form.id) }}
{{ wtf.form_field(form.name) }}
{{ wtf.form_field(form.manager_name) }}
{{ wtf.form_field(form.address) }}
...
{{ wtf.form_field(form.submit) }}
<a href="{{ url_for('previous_page_view_name') }}" class="btn btn-secondary">Cancel</a>
</form>
Вот как это работает для меня.
В моей форме ...
btn_cancel = SubmitField(label='Cancel',
render_kw={'formnovalidate': True})
В моем коде Python (views.py в вашем случае) ...
if request.method == 'POST':
if form.btn_cancel.data:
return redirect(url_for('data'))
Редактирование в последнюю минуту: примечание Грея Ли ниже о разрешении вашей функции просмотра принимать запросы POST также важно. Убедитесь, что вы это проверили.