I suggest you to use flask forms. I give simple example here. It has simple usage syntax. forms.py includes your form elements with its requriements, create_task.html is a template which includes your html codes and form elements. Also views.py include your router function.
forms.py file:
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, DateField, SubmitField
from wtforms.validators import DataRequired
class CreateTaskForm(FlaskForm):
title = StringField('Title', validators=[DataRequired()])
content = TextAreaField('Content', validators=[DataRequired()])
expected_dead_line = DateField('Expected Dead Line', validators=[DataRequired()])
submit = SubmitField('Save It')
create_task.html
<form action="" method="POST">
{{ form.hidden_tag() }}
<div class="row">
<div class="col-12 mb-4">
<div class="form-outline">
{{ form.title(class='form-control', placeholder='Title') }}
</div>
</div>
</div>
<div class="row">
<div class="col-12 mb-4">
<div class="form-outline">
{{ form.content(class='form-control', placeholder='Content', rows=8) }}
</div>
</div>
</div>
<div class="row">
<div class="col-4 mb-4">
<div class="form-outline">
<label>Expected Dead Line</label>
</div>
</div>
<div class="col-8 mb-4">
<div class="form-outline">
{{ form.expected_dead_line(class='form-control') }}
</div>
</div>
</div>
<div class="row">
<div class="col-12 mb-4">
<div class="form-outline">
{{ form.submit(class_='form-control btn btn-success') }}
</div>
</div>
</div>
</form>
views.py
@task.route('/create', methods=['GET', 'POST'])
def create_new_task():
form = CreateTaskForm()
if request.method == 'POST' and form.validate():
title = request.form.get('title')
content = request.form.get('content')
expected_dead_line = request.form.get('expected_dead_line')
#your operations
return render_template('task/create_task.html', form=form)
Also, you can install Flask-Form with this pip command.
pip install Flask-WTF