我正在 Flask 中构建一个简单的待办事项列表应用程序,并且创建了一个表单,该表单应该在用户帐户中添加任务。
烧瓶形式:
class AddTask(FlaskForm):
title = StringField('Title', validators = [DataRequired()])
description = StringField('Description')
project = SelectField('Project', choices = [], validators = [DataRequired()])
due_date_time = DateField('Due Date', format = '%Y-%m-%d')
priority = RadioField('Priority', choices = [(1, 'Priority 1'), (2, 'Priority 2'), (3, 'Priority 3'), (4, 'Priority 4')])
submit = SubmitField('Add Task')
attributes_to_clear = [title, description, project, due_date_time, priority]
HTML 代码:
<div class = "new_task_form">
<form action = "/app/today" method = "POST">
{{ new_task_form.hidden_tag() }}
{{ new_task_form.csrf_token }}
{{ new_task_form.title.label }}
{{ new_task_form.title }}
{% if new_task_form.title.errors %}
<ul class="errors">
{% for error in new_task_form.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
{{ new_task_form.description.label }}
{{ new_task_form.description }}
{{ new_task_form.project.label }}
{{ new_task_form.project }}
{{ new_task_form.due_date_time.label }}
{{ new_task_form.due_date_time }}
{{ new_task_form.priority.label }}
{{ new_task_form.priority }}
{{ new_task_form.submit() }}
</form>
</div>
路线:
@app.route('/app/today', methods = ['POST', 'GET'])
@login_required
def today():
today = datetime.today().strftime('%a %b %d')
projects = [(project.id, project.title) for project in Project.query.filter(Project.user_id == current_user.id).all()]
new_task_form = AddTask()
new_task_form.project.choices = projects
logger.info(f'new_task_form.project.choices: {new_task_form.project.choices}')
if new_task_form.validate_on_submit():
logger.info(f'new_task_form.validate_on_submit() returned {new_task_form.validate_on_submit()}')
project_from_form = Project.query.filter(Project.id == new_task_form.project.data).first()
logger.error(f'project_from_form: {project_from_form}')
new_task = Task(
title = new_task_form.title.data,
description = new_task_form.description.data,
project = project_from_form,
due_date_time = new_task_form.due_date_time.data,
priority_level = new_task_form.priority.data,
user_id = current_user.id
)
db.session.add(new_task)
db.session.commit()
else:
logger.info(f'new_task_form.validate_on_submit(): Returned {new_task_form.validate_on_submit()}')
logger.info(f'new_task_form.errors: {new_task_form.errors}')
pending_tasks = Task.query.filter(Task.user_id == current_user.id, Task.completed_status == 0).all()
pending_tasks_length = len(pending_tasks)
logger.info(f'current_user: {current_user.id}')
logger.info(f'pending_tasks_length: {pending_tasks_length}')
logger.info(f'pending_tasks: {pending_tasks}')
return render_template('today.html',
day_and_date = today,
new_task_form = new_task_form,
user_projects = projects,
pending_tasks_length = pending_tasks_length,
pending_tasks = pending_tasks)
我遇到的问题是我不希望页面在提交后刷新。现在,它的工作原理是您可以添加任务,它会立即填充在页面上。然而,实际的 Flask 表单将保留您之前插入的任何内容,并且刷新将导致它重新提交。我环顾四周,但找不到消除文本的方法,我厌倦了使用
default
值,构建将它们重置为空字符串的函数,但到目前为止我尝试过的任何方法都无法修复此问题特定问题。
即使在使用已完成的相同表单将成功的条目提交到数据库后,您也会将此 html 发送给用户
return render_template('today.html',
day_and_date = today,
new_task_form = new_task_form,
user_projects = projects,
pending_tasks_length = pending_tasks_length,
pending_tasks = pending_tasks)
您想要做的事情将需要一些 JavaScript,因为 Flask 无法自行完成此操作。 我建议阅读这个答案:https://stackoverflow.com/a/62081993/22796342 他们提供了这个代码:
form.addEventListener('submit', function(event) {
event.preventDefault(); // prevent page from refreshing
const formData = new FormData(form); // grab the data inside the form fields
fetch('/', { // assuming the backend is hosted on the same server
method: 'POST',
body: formData,
}).then(function(response) {
// do something with the response if needed.
// If you want the table to be built only after the backend handles the request and replies, call buildTable() here.
});
});