Thêm nút hủy trong Flask bằng Flask-WTF / WTForms
Tôi muốn thêm nút hủy để quay lại trang trước. Mã của tôi là: form.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')
và trang mẫu:
{% 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 %}
lượt xem, py
@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)
Tôi gặp lỗi 405 khi nhấp vào nút hủy: Phương pháp không được phép.
Sai lầm của tôi là ở đâu? và tôi nên thêm những gì để quay lại trang trước khi tôi nhấp vào Hủy?
cảm ơn
Trả lời
Không, tôi đang sử dụng Trường thời gian để thực thi việc nắm bắt Thời gian hợp lệ. Tôi đã không cố gắng thay đổi trường đó thành trường văn bản bình thường, vì vậy thay vào đó, tôi đã sử dụng tùy chọn Hủy liên kết ở trên. Tuy nhiên, sở thích của tôi vẫn là có nút Hủy.
Tôi gặp lỗi 405 khi nhấp vào nút hủy: Phương pháp không được phép. Sai lầm của tôi là ở đâu?
Khi bạn gửi biểu mẫu, dữ liệu sẽ được gửi dưới dạng yêu cầu ĐĂNG (vì phần tử biểu mẫu được kết xuất sẽ sử dụng <form method="post">
). Tuy nhiên, chức năng xem của bạn chỉ cho phép yêu cầu GET như mặc định, để chấp nhận yêu cầu POST, bạn phải chỉ định methods
tham số như sau:
@orgs.route('/organisations/org_new', methods=['GET', 'POST']) # <--
@login_required
def org_new():
# ...
và tôi nên thêm những gì để quay lại trang trước khi tôi nhấp vào Hủy?
Bất kỳ trường nào được tạo với SubmitField
sẽ được hiển thị dưới dạng nút gửi ( <input type="submit">
), vì vậy nó sẽ gửi biểu mẫu khi bạn nhấp vào nó.
Để làm cho nó quay trở lại trang trước khi bạn nhấp vào nút hủy, thông thường có hai phương pháp để đạt được điều này:
1. Bắt nút gửi trong chức năng xem
Giống như phương pháp trong câu trả lời của Ben . Bạn chỉ có thể bắt gửi, sau đó chuyển hướng người dùng đến trang trước:
@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 Vì bạn đã thiết lập novalidate=True
trong wtf.quick_form
, bạn không cần phải thiết lập render_kw={'formnovalidate': True}
trên cancel
nút trong lớp mẫu.
2. Tạo một <a>
nút thay vì một cancel
trường
Bạn có thể tạo một <a>
phần tử bình thường dưới dạng nút hủy ( class="btn btn-secondary"
) và điền href
tham số với URL của trang trước (sau đó bạn không cần thêm cancel
trường vào lớp biểu mẫu của mình). Theo cách này, bạn không thể sử dụng wtf.quick_form()
, thay vào đó, bạn sẽ cần hiển thị từng trường theo cách thủ công với 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>
Đây là cách điều này làm việc cho tôi.
Ở dạng của tôi ...
btn_cancel = SubmitField(label='Cancel',
render_kw={'formnovalidate': True})
Trong mã Python của tôi (views.py trong trường hợp của bạn) ...
if request.method == 'POST':
if form.btn_cancel.data:
return redirect(url_for('data'))
Chỉnh sửa phút cuối: Ghi chú của Gray Li bên dưới về việc cho phép chức năng xem của bạn chấp nhận các yêu cầu ĐĂNG cũng rất quan trọng. Chắc chắn rằng bạn kiểm tra nó rồi.