Flask WTFforms : impossible to locate the validation error

15 Views Asked by At

I'm encountering issues while trying to implement a route to update data in my database using Flask. I have a template and a form model, and although I receive a 200 HTTP response, the data doesn't seem to update. Furthermore, specific error messages are not present in the logs.

Upon debugging, I noticed that I cannot print anything inside the "if form.validate_on_submit():" condition. However, I can't print any error messages to identify where the validation fails. Additionally, my form has no validator.

Here is my form model :

class UpdateMaisons(FlaskForm):
    id =  StringField("id", validators=[DataRequired()]) 
    denomination =  StringField("denomination", validators=[])
    code_postal =  StringField("code_postal", validators=[])
    adresse =  StringField("adresse", validators=[])
    commune =  StringField("commune", validators=[])
    dpmt =  StringField("dpmt", validators=[])
    region =  SelectField("region", choices=[], validators=[])
    code_INSEE =  StringField("code_INSEE", validators=[])
    pays =  StringField("pays", validators=[])
    date_label =  StringField("date_label", validators=[])
    latitude =  StringField("latitude", validators=[])
    longitude =  StringField("longitude", validators=[])
    museeFrance =  BooleanField("musee_france", validators=[])
    monumentsInscrits =  BooleanField("monuments_inscrits", validators=[])
    monumentsClasses =  BooleanField("monuments_classes", validators=[])
    nombreSPR =  IntegerField("nombre_SPR", validators=[])
    type =  SelectField("type", choices=[], validators = [])
    idWikidata =  SelectField("id_wikidata", choices = [], validators=[])

Here is my template :

<form action="{{url_for('update_maisons', nom_maison=donnees.denomination)}}" method="post" name="update_maisons">
    {{ form.hidden_tag() }}

{%if donnees%}
    <div>
       <h1>Dénomination du bâtiment : 
        {{donnees.denomination}}</h1>
    </div>

    <div class="form-group">
        <label for="id">Identifiant Mérimée : </label>
        {{ form.id(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="adresse">Adresse : </label>
        {{ form.adresse(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="code_postal">Enter le code Postal : </label>
        {{ form.code_postal(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="commune">Dans quelle commune : </label>
        {{ form.commune(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="code_INSEE">Enter le code INSEE de la commune : </label>
        {{ form.code_INSEE(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="dpmt">Dans quel département : </label>
        {{ form.dpmt(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="region">Région d'appartenance : </label>
        {{ form.region(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="latitude">Latitude : </label>
        {{ form.latitude(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="longitude">Longitude : </label>
        {{ form.longitude(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="date_label">Date de labellisation : </label>
        {{ form.date_label(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="type">Domaine de génie : </label>
        <small id="type" class="form-text text-muted">Sélectionner le domaine : </small>
        {{ form.type(class_="form-control") }}
    </div>

    <div class="form-group">
        <p>Cocher les labels additionnels : </p>
        <label for="musee_france">Le bâtiment est aussi Musée de France </label>
        {{ form.museeFrance() }}
    </div>

    <div class="form-group">
        <label for="monuments_inscrit">Le bâtiment est aussi Monument National Inscrit </label>
        {{ form.monumentsInscrits() }}
    </div>

    <div class="form-group">
        <label for="monuments_classes">Le bâtiment est aussi Monument National Classé </label>
        {{ form.monumentsClasses() }}
    </div>

    <div class="form-group">
        <label for="nombre_SPR">Nombre de Sites Patrimoniaux Remarquables dans la commune : </label>
        {{ form.nombreSPR(class_="form-control") }}
    </div>

    <div class="form-group">
        <label for="id_wikidata">Sélectionner l'identifiant de la personne associée : </label>
        {{ form.idWikidata(class_="form-control") }}
    </div>

    {%endif%}

    <p><input type="submit" value="Mettre à jour"></p>
</form>

And here the route :

@app.route("/update/maisons/<string:nom_maison>", methods=['GET', 'POST'])
def update_maisons(nom_maison):
    distinct_regions = Maisons.get_distinct_regions()
    donnees= Maisons.query.filter(Maisons.denomination == nom_maison).first()
    form = UpdateMaisons(obj=donnees)
    form.idWikidata.choices = [('','')] + [(personnes.idWikidata, personnes.idWikidata) for personnes in Personnes.query.all()]
    form.region.choices = [('','')] + [(region, region) for region in distinct_regions]
    form.type.choices = [('','')] + [(domaine.value, domaine.value) for domaine in Domaine]

    print("Formulaire est-il valide ?", form.validate_on_submit())
    if not form.validate_on_submit():
        app.logger.error("Erreurs de validation du formulaire : %s", form.errors)

    try:
        if form.validate_on_submit():
            id =  clean_arg(request.form.get("id", None))
            adresse =  clean_arg(request.form.get("adresse", None))
            commune =  clean_arg(request.form.get("commune", None))
            code_postal =  clean_arg(request.form.get("code_postal", None))
            code_INSEE =  clean_arg(request.form.get("code_INSEE", None))
            dpmt =  clean_arg(request.form.get("dpmt", None))
            region =  clean_arg(request.form.get("region", None))
            pays =  clean_arg(request.form.get("pays", None))
            latitude =  clean_arg(request.form.get("latitude", None))
            longitude =  clean_arg(request.form.get("longitude", None))
            date_label =  clean_arg(request.form.get("date_label", None))
            type =  clean_arg(request.form.get("type", None))
            museeFrance =  clean_arg(request.form.get("musee_france", None))
            monumentsInscrits =  clean_arg(request.form.get("monuments_inscrits", None))
            monumentsClasses =  clean_arg(request.form.get("monuments_classes", None))
            nombreSPR =  clean_arg(request.form.get("nombre_SPR", None))
            idWikidata = clean_arg(request.form.get("id_wikidata", None))


        # Récupérer l'objet Maison à mettre à jour
            maison_a_mettre_a_jour = Maisons.query.filter(Maisons.denomination == nom_maison).first()

            # Vérifier si l'objet existe
            if maison_a_mettre_a_jour:
                # Mettre à jour les propriétés de l'objet avec les nouvelles valeurs
                maison_a_mettre_a_jour.id = id
                maison_a_mettre_a_jour.adresse = adresse
                maison_a_mettre_a_jour.commune = commune
                maison_a_mettre_a_jour.code_postal = code_postal
                maison_a_mettre_a_jour.code_INSEE = code_INSEE
                maison_a_mettre_a_jour.dpmt = dpmt
                maison_a_mettre_a_jour.region = region
                maison_a_mettre_a_jour.pays = pays
                maison_a_mettre_a_jour.latitude = latitude
                maison_a_mettre_a_jour.longitude = longitude
                maison_a_mettre_a_jour.date_label = date_label
                maison_a_mettre_a_jour.type = Domaine[type]
                maison_a_mettre_a_jour.museeFrance = museeFrance
                maison_a_mettre_a_jour.monumentsInscrits = monumentsInscrits
                maison_a_mettre_a_jour.monumentsClasses = monumentsClasses
                maison_a_mettre_a_jour.nombreSPR = nombreSPR
                maison_a_mettre_a_jour.idWikidata = idWikidata

                # Effectuez l'opération de mise à jour
                db.session.commit()
                print("insertion faite")

                # Rediriger vers une page de confirmation ou une autre page appropriée
                #return redirect(url_for('info_maisons', nom_maisons=nom_maison))
            else:
                print("Aucun information sur cette maison.")
    except Exception as e:
        print(f"Une erreur s'est produite : {str(e)}")
        db.session.rollback()

    return render_template("pages/update_maisons.html", 
            sous_titre= "Update maisons", 
            form=form, 
            donnees=donnees)

Here is the response when I run the code :

Formulaire est-il valide ? False [2024-02-16 19:52:35,538] ERROR in update: Erreurs de validation du formulaire : {} 127.0.0.1 - - [16/Feb/2024 19:52:35] "GET /update/maisons/MAISON%20DE%20%0A%20JULIE%20VICTOIRE%20DAUBIÉ HTTP/1.1" 200 - Formulaire est-il valide ? False [2024-02-16 19:52:35,606] ERROR in update: Erreurs de validation du formulaire : {} 127.0.0.1 - - [16/Feb/2024 19:52:35] "GET /update/maisons/MAISON%20DE%20%0A%20JULIE%20VICTOIRE%20DAUBIÉ HTTP/1.1" 200 - Formulaire est-il valide ? False [2024-02-16 19:52:35,757] ERROR in update: Erreurs de validation du formulaire : {} 127.0.0.1 - - [16/Feb/2024 19:52:35] "GET /update/maisons/MAISON%20DE%20%0A%20JULIE%20VICTOIRE%20DAUBIÉ HTTP/1.1" 200 -

I would appreciate any help in understanding these logs or gaining access to more information about the validation error. Thank you!

0

There are 0 best solutions below