Começaremos importando mais algumas dependências do flask (request, url_for, flash, redirect)
from flask import Flask, render_template, request, url_for, flash, redirect
Criaremos a rota create, que aceita dois métodos diferentes(GET e POST), e caso seja post ele irá guardar os dados no banco, caso seja get irá mostrar o formulário de cadastro:
@app.route('/create', methods=('GET', 'POST'))
def create():
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
if not title:
flash('Title is required')
else:
post = Posts(title = title, content=content)
db.session.add(post)
db.session.commit()
return redirect(url_for('index'))
return render_template('create.html')
Para mensagens de erros iremos utilizar o flash, que já está sendo chamado ali na função acima caso title esteja vazio, e a exibição da mensagem de erro fica como o código abaixo:
{% for message in get_flashed_messages() %}
<div class="alert alert-danger">{{ message }}</div>
{% endfor %}
Funcionará muito semelhante a rota de criação, com a única diferença sendo a rota, e o value dos inputs
Rota
@app.route('/<int:id>/edit', methods=('GET','POST'))
def edit(id):
post = get_post(id)
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
if not title:
flash('Title is required!')
else:
post.title = title
post.content = content
db.session.commit()
return redirect(url_for('index'))
return render_template('edit.html', post = post)
Inputs
<div class="form-group">
<label for="title">Title</label>
<input
type="text"
class="form-control"
name="title"
id="title"
placeholder="Post title"
value="{{ request.form['title'] or post['title'] }}"
/>
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea
class="form-control"
name="content"
id="content"
placeholder="Post content"
>{{ request.form['content'] or post['content'] }}</textarea>
</div>
Criaremos a rota de exclusão
@app.route('/<int:id>/delete', methods = ('POST'))
def delete(id):
post = get_post(id)
db.session.delete(post)
db.session.commit()
flash('"{}" foi apagado com sucesso!'.format(post.title))
return redirect(url_for('index'))
Adicionaremos o formulário de exclusão logo abaixo do formulário de edição
<hr/>
<form action="{{ url_for('delete', id=post['id']) }}" method="POST">
<input
type="submit"
value="Apagar"
class="btn btn-danger btn-sm"
onclick="return confirm('Are you sure you want to delete this post?')"
/>
</form>