Home > Back-end >  Multiple form on a page validation errors WTForms
Multiple form on a page validation errors WTForms

Time:01-13

I have multiple form on a page in modals: 1-st to create a new user address and n-forms with addresses which user created (created with loop). When i enter invalid data in fields with validators (e.g. datarequired), i have error messages in each form. Here is the field render example which i use in every form:

{{ address_form.street.label(class_="form-label", for="InputStreet") }}
{{ address_form.street(class_="form-control", id="InputStreet") }}
{% for error in address_form.street.errors %}
    <span style="color: red;">{{ error }}</span>
{% endfor %}

Part of the code from view.py:

@bp.route('/profile/address', methods=['GET', 'POST'])
@login_required
def address():
    address_form = AddressForm()
        if address_form.submit_address.data and address_form.validate():
            address_to_add = Address(
                street=address_form.street.data,
                house=address_form.house.data,
                building=address_form.building.data,
                entrance=address_form.entrance.data,
                floor=address_form.floor.data,
                apartment=address_form.apartment.data,
                additional_info=address_form.additional_info.data, 
                user=current_user)
            db.session.add(address_to_add)
            db.session.commit()
            return redirect(url_for('profile.address'))
        if address_form.edit_address.data and address_form.validate():
            address_to_edit = Address.query.get(address_form.address_id.data) # Here is data from hidden field
            # Editing data in DB
            db.session.commit()
            return redirect(url_for('profile.address'))
        return render_template('profile/address.html', title='Адрес доставки', address_form=address_form)

Forms work fine with adding, editing and deleting data, but work incorrect with validation errors. I think i need one more condition in if statenent related with hidden field or change something in my html file. I've tried add an action attr in form like:

<form action="{{ url_for('profile.address', form_id=address.id) }}" method="post" novalidate>

And smth like this in view func but it doesn't work:

form_id = request.args.get('form_id', type=int)
if address_form.edit_address.data and address_form.validate() and form_id == address_form.address_id.data:
    pass

CodePudding user response:

I tried this one more time

<form action="{{ url_for('profile.address', form_id=address.id) }}" method="post" novalidate>

form_id = request.args.get('form_id', type=int)
if address_form.edit_address.data and address_form.validate():
    pass

with

{{ address_form.street.label(class_="form-label", for="InputStreet") }}
{{ address_form.street(class_="form-control", id="InputStreet", value=address.street) }}
{% if form_id == address.id %}
    {% for error in address_form.street.errors %}
        <span style="color: red;">{{ error }}</span>
    {% endfor %}
{% endif %}

Now it works fine with forms which are created with loop, but still have a validation error messages in main adding form.

CodePudding user response:

Finally i found a very bad solution:

address_form = AddressForm()
form_id = request.args.get('form_id', 0, type=int)

For main form form_id always is 0. Form tag for main form:

<form action="{{ url_for('profile.address', form_id=form_id) }}" method="post" novalidate>

And a field render for main form:

{{ address_form.street.label(class_="form-label", for="InputStreet") }}
{{ address_form.street(class_="form-control", id="InputStreet") }}
{% if form_id == 0 %}
   {% for error in address_form.street.errors %}
       <span style="color: red;">{{ error }}</span>
   {% endfor %}
{% endif %}

If someone has a better solution about my problem it'd good. Now it's time to learn some JS and solve this problem with AJAX.

  •  Tags:  
  • Related