[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