Flask-WTF / WTForms ile Flask'a bir iptal düğmesi ekleyin

Aug 16 2020

Önceki sayfaya geri giden bir iptal düğmesi eklemek istiyorum. Kodum: 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')

ve şablon sayfası:

{% 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 %}

görünümler, 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)

İptal düğmesine tıkladığımda 405 hatası alıyorum: Yönteme izin verilmiyor.

Hatam nerede ve İptal'e tıkladığımda önceki sayfaya dönmek için ne eklemeliyim?

Teşekkürler

Yanıtlar

baldy Sep 16 2020 at 10:12

Hayır, geçerli bir Zamanın yakalanmasını zorunlu kılmak için TimeField kullanıyorum. Bunu normal bir metin alanıyla değiştirmeyi denemedim, bu yüzden bunun yerine yukarıdaki Bağlantıyı iptal et seçeneğini tercih ettim. Tercihim yine de bir İptal düğmesine sahip olmak.

3 GreyLi Aug 17 2020 at 13:19

İptal düğmesine tıkladığımda 405 hatası alıyorum: Yönteme izin verilmiyor. Hatam nerede

Formu gönderdiğinizde, veriler bir POST isteği olarak gönderilecektir (çünkü oluşturulan form öğesi kullanacaktır <form method="post">). Ancak, görüntüleme işleviniz varsayılan olarak yalnızca GET isteğine izin verir, POST isteğini kabul etmek için, aşağıdaki methodsgibi parametreyi belirtmeniz gerekir :

@orgs.route('/organisations/org_new', methods=['GET', 'POST'])  # <--
@login_required
def org_new():
   # ...

ve İptal'e tıkladığımda önceki sayfaya dönmek için ne eklemeliyim?

İle oluşturulan herhangi bir alan SubmitField, bir gönder düğmesi ( <input type="submit">) olarak görüntülenecektir, bu nedenle, üzerine tıkladığınızda formu gönderecektir.

İptal düğmesine tıkladığınızda önceki sayfaya geri dönmesini sağlamak için, bunu başarmanın normalde iki yöntemi vardır:

1. Görünüm işlevinde gönder düğmesini yakalayın

Ben'in cevabındaki yöntem gibi . Sadece gönderimi yakalayabilir ve ardından kullanıcıyı önceki sayfaya yönlendirebilirsiniz:

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

Zaten belirledik yana PS novalidate=Trueiçinde wtf.quick_form, sette gerekmez render_kw={'formnovalidate': True}üzerindecancel formu sınıfında düğme.

2. Alan <a>yerine düğme oluşturuncancel

<a>İptal düğmesi ( class="btn btn-secondary") olarak normal bir öğe oluşturabilir ve hrefparametreyi önceki sayfanın URL'si ile doldurabilirsiniz (bu durumda cancelform sınıfınıza alan eklemeniz gerekmez ). Bu şekilde, kullanamazsınız wtf.quick_form(), bunun yerine her alanı manuel olarak aşağıdakilerle oluşturmanız gerekir 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

Bu benim için şu şekilde çalışıyor.

Benim formumda ...

btn_cancel = SubmitField(label='Cancel',
                         render_kw={'formnovalidate': True})

Python kodumda (sizin durumunuzda views.py) ...

if request.method == 'POST':
    if form.btn_cancel.data:
        return redirect(url_for('data'))

Son dakika düzenlemesi: Gray Li'nin, görüntüleme işlevinizin POST isteklerini kabul etmesine izin vermekle ilgili aşağıdaki notu da önemlidir. Kontrol ettiğinizden emin olun.