[Flask] Form with no validators failing validation

Anthony Ford ford.anthonyj at gmail.com
Mon Apr 25 14:54:18 EDT 2016


I'm about to board a flight, so forgive the short message and lack of
links, but do you have csrf enabled? If so, there's a chance you might be
running into that. You can force disable it in your form model and see if
that resolves it, or you can include the form.hidden_tags in your template.

I may have the spelling or capitalization wrong, so check the flask-wtf
docs for details.

--Anthony
On Apr 25, 2016 2:49 PM, "Alex Hall" <ahall at autodist.com> wrote:

> Hi list,
> As the subject says, my form is doing something odd. Though I've defined
> no validators for it at all, it's suddenly failing validation. I've tried
> validate() and validate_on_submit() with no change. My form is quite simple:
>
> class OrderSearchForm(Form):
>  orderNumber = StringField("orderNumber")
>  #orderNumber = StringField("orderNumber", validators=[Length(-1, 7, "If
> you enter an order number, it must be 5 or 7 characters.")])
>  orderGeneration = IntegerField("orderGeneration")
>  startDate = StringField("startDate")
>  endDate = StringField("endDate")
>  hiddenStartDate = HiddenField("hiddenStartDate")
>  hiddenEndDate = HiddenField("hiddenEndDate")
>  maxResults = StringField("maxResults")
>  hasErrors = BooleanField("hasErrors")
>  users = SelectMultipleField("Users", choices=[(u, u) for u in userNames])
>  locations = SelectMultipleField("warehouses", choices=[(l, l) for l in
> locations])
>
> I've defined usernames and locations already. When I output the field
> values, I see that my hidden date fields have values while my visible ones
> don't, and that everything else is fine--empty if I didn't enter data,
> presenting the text entered or options selected if I did anything to that
> field. That is, the form data seems to be passing back to the function with
> no problem, but it always fails. Here's my function:
>
> @app.route("/orderSearch", methods=searchMethods)
> def orderSearch():
>  searchForm = OrderSearchForm()
>  #now that the form is constructed, we can set the label text properties
> of the elements
>  searchForm.orderNumber.label.text = "Order number to search for"
>  searchForm.orderGeneration.label.text = "Order generation (leave blank
> for all generations)"
>  searchForm.startDate.label.text = "Starting date of search"
>  searchForm.endDate.label.text = "End date of search"
>  searchForm.maxResults.label.text = "Maximum results to return"
>  searchForm.locations.label.text = "choose locations to include"
>  searchForm.users.label.text = "user accounts to include"
>  searchForm.hasErrors.label.text = "Only orders with errors"
>
>  if request.method != "POST":
>   print "Returning rendered template. Validated: %s. Method: %s."
> %(searchForm.validate(), request.method)
>   return render_template("search.html", form=searchForm, title="Order
> Search")
>  elif not searchForm.validate_on_submit():
>   print "Form failed validation."
>   orderNumber = request.form.get("orderNumber", None)
>   orderGeneration = request.form.get("orderGeneration", None)
>   errorsOnly = bool(request.form.get("hasErrors", False))
>   locations = request.form.getlist("locations", None)
>   users =request.form.getlist("users", None)
>   startDate = request.form.getlist("startDate", None)
>   endDate = request.form.getlist("endDate", None)
>   hiddenStartDate = request.form.getlist("hiddenStartDate", None)
>   hiddenEndDate = request.form.getlist("hiddenEndDate", None)
>   maxResults = request.form.getlist("maxResults", None)
>   print "Number: {number}\nGeneration: {generation}\nLocations:
> {locations}\nUsers: {users}\nErrors Only: {errorsOnly}\nStart Date:
> {startDate}\nEnd Date: {endDate}\nHidden Start Date:
> {hiddenStartDate}\nHidden End Date:
> {hiddenEndDate}".format(number=orderNumber, generation=orderGeneration,
> locations=locations, users=users, errorsOnly=errorsOnly,
> startDate=startDate, endDate=endDate, hiddenStartDate=hiddenStartDate,
> hiddenEndDate=hiddenEndDate)
>   return json.dumps(
>    { "errors": [
>     {"Number": 0, "Message": "The form failed validation."}
>    ]}
>   )
>  else: #the form was posted, and passed validation, so return the JSON
>   print "Returning JSON."
>   orderNumber = request.form.get("orderNumber", None)
>   orderGeneration = request.form.get("orderGeneration", None)
>   errorsOnly = bool(request.form.get("hasErrors", False))
>   locations = request.form.getlist("locations", None)
>   users =request.form.getlist("users", None)
>   maxResults = request.form.getlist("maxResults", None)
>   print "Number: {number}\nGeneration: {generation}\nLocations:
> {locations}\nUsers: {users}\nErrors Only:
> {errorsOnly}".format(number=orderNumber, generation=orderGeneration,
> locations=locations, users=users, errorsOnly=errorsOnly)
>   print request.form.hiddenStartDate
>   print request.form.hiddenEndDate
>   results = []
>   for result in DBInterface.getOrderDetails(orderNumber=orderNumber,
> orderGeneration=orderGeneration, locations=locations, users=users,
> errorsOnly=errorsOnly, limit=maxResults):
>    results.append({
>     "username": result.user,
>     "orderNumber": result.reference_3[:5],
>    "orderGeneration": result.reference_3[5:7],
>    "computer": result.computer,
>     "errors": result.reference_9
>    })
>   return json.dumps(results)
>
> The only thing I've changed recently is the addition of the date fields,
> the visible two of which are tied via JS to JQueryUI date pickers and the
> hidden two of which are those pickers' altFields. They seem to work fine,
> though. I'm not sure why it would keep failing like this; again, there are
> no validators at all. I've killed the Flask server and restarted it, just
> to check that something odd wasn't going on there, but that didn't do
> anything. Is there anything else I could do? Any other code you'd need to
> see?
>
> --
> Alex Hall
> Automatic Distributors, IT department
> ahall at autodist.com
>
> _______________________________________________
> Flask mailing list
> Flask at python.org
> https://mail.python.org/mailman/listinfo/flask
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/flask/attachments/20160425/63bbcc30/attachment-0001.html>


More information about the Flask mailing list