-
-
Save doobeh/4668212 to your computer and use it in GitHub Desktop.
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Title</title> | |
</head> | |
<body> | |
<form method="post"> | |
{{ form.hidden_tag() }} | |
{{ form.example }} | |
<button type="submit">Submit</button> | |
</form> | |
</body> | |
</html> |
from flask import Flask, render_template | |
from flask_wtf import FlaskForm | |
from wtforms import widgets, SelectMultipleField | |
SECRET_KEY = 'development' | |
app = Flask(__name__) | |
app.config.from_object(__name__) | |
class MultiCheckboxField(SelectMultipleField): | |
widget = widgets.ListWidget(prefix_label=False) | |
option_widget = widgets.CheckboxInput() | |
class SimpleForm(FlaskForm): | |
string_of_files = ['one\r\ntwo\r\nthree\r\n'] | |
list_of_files = string_of_files[0].split() | |
# create a list of value/description tuples | |
files = [(x, x) for x in list_of_files] | |
example = MultiCheckboxField('Label', choices=files) | |
@app.route('/',methods=['post','get']) | |
def hello_world(): | |
form = SimpleForm() | |
if form.validate_on_submit(): | |
print(form.example.data) | |
return render_template("success.html", data=form.example.data) | |
else: | |
print("Validation Failed") | |
print(form.errors) | |
return render_template('example.html',form=form) | |
if __name__ == '__main__': | |
app.run(debug=True) |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Title</title> | |
</head> | |
<body> | |
<h1>Success</h1> | |
{{ data }} | |
</body> | |
</html> |
Thank you
Any idea on how the example.html should be structured ? I'm not able to figure it out.
what does your Models.py look like?
Thanks a lot!
example.html
<html>
<body>
<form method="post">
{{ form.csrf_token }}
{{ form.example }}
<input type="submit">
</form>
</body>
</html>
The form.validate_on_submit() does not work in this case. It considers the values as invalid. Hence use form.is_submitted() to make it work.
if form.is_submitted():
print form.example.data
else:
print form.errors
return render_template('example.html',form=form)
@shyenatech-- the code seems (admittedly outdated) but fine, are you sure you're including the csrf token {{ form.hidden_tag() }}
to handle the security component? I've updated it for the new version of Flask-WTF here: https://gist.github.com/doobeh/4668212 to give you an idea of how you don't have to skip the important validation step. Good luck!
How to query data from db instead of choices=files
Hi! How I mark as checked a checkbox? Is for an edit form. Where I need to mark was already marked before on the create
Thanks for this code example.
I was struggling with validating the form though. I needed at least one checkbox to be checked. Above comments mentioning form.validate_on_submit()
or form.is_submitted()
unfortunately didn't help.
After some googling I stumbled on this stackoverflow answer that finally helped.
My final custom validator code:
def validate(self, extra_validators=None):
if super().validate(extra_validators):
if not request.form.getlist('example'):
self.example.errors.append('At least one checkbox must be selected')
return False
else:
return True
return False
Yeah I would like to see how it is rendered in the html template. For me the border only surrounds the first option which makes it look very messy. a shame because the rest works beautifully