Flask-WTF / WTForms를 사용하여 Flask에 취소 버튼 추가

Aug 16 2020

이전 페이지로 돌아가는 취소 버튼을 추가하고 싶습니다. 내 코드는 : 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 %}

보기, 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)

취소 버튼을 클릭하면 405 오류가 발생합니다. 방법이 허용되지 않습니다.

내 실수는 어디에 있습니까? 취소를 클릭 할 때 이전 페이지로 돌아가려면 무엇을 추가해야합니까?

감사

답변

baldy Sep 16 2020 at 10:12

아니요, TimeField를 사용하여 유효한 시간 캡처를 시행하고 있습니다. 나는 그것을 일반 텍스트 필드로 변경하지 않았으므로 대신 위의 링크 취소 옵션을 사용했습니다. 내 선호는 여전히 취소 버튼이 있습니다.

3 GreyLi Aug 17 2020 at 13:19

취소 버튼을 클릭 할 때 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.보기 기능에서 버튼 제출 캐치

Ben 's answer 의 방법과 같습니다 . 제출을 포착 한 다음 사용자를 이전 페이지로 리디렉션 할 수 있습니다.

@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'))
    # ...

당신이 이미 설정 한 이후 추신 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>
3 Ben Aug 17 2020 at 08:06

이것이 나를 위해 작동하는 방법입니다.

내 형태로 ...

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 요청을 수락하도록 허용하는 것에 대한 Gray Li의 아래 메모도 중요합니다. 당신이 그것을 확인하십시오.