फ्लास्क-डब्ल्यूटीएफ / डब्ल्यूटीफॉर्म के साथ फ्लास्क में एक रद्द बटन जोड़ें

Aug 16 2020

मैं एक रद्द बटन जोड़ना चाहूंगा जो पिछले पृष्ठ पर वापस जाता है। मेरा कोड है: 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')

और टेम्प्लेट पृष्ठ:

{% 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 त्रुटि है: विधि की अनुमति नहीं है।

मेरी गलती कहाँ है? और जब मुझे रद्द पर क्लिक करना हो, तो मुझे पिछले पृष्ठ पर वापस जाने के लिए क्या जोड़ना चाहिए?

धन्यवाद

जवाब

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. व्यू फंक्शन में बटन सबमिट करें

बेन के जवाब में विधि की तरह । आप बस सबमिट को पकड़ सकते हैं और उपयोगकर्ता को पिछले पृष्ठ पर पुनर्निर्देशित कर सकते हैं:

@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})

मेरे पायथन कोड में (आपके मामले में view.py) ...

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

अंतिम मिनट संपादित करें: POST अनुरोधों को स्वीकार करने के लिए आपके दृश्य फ़ंक्शन को अनुमति देने के बारे में नीचे ग्रे जी का नोट भी महत्वपूर्ण है। इसे जांचना सुनिश्चित करें।