Resumo : neste tutorial, você aprenderá como criar um formulário de edição do Django para atualizar um post e salvar as alterações no banco de dados.
Este tutorial começa onde o tutorial de criação de mensagens flash do Django parou.
Criaremos um formulário de edição do Django que atualiza uma postagem do blog e salva as alterações no banco de dados.
Crie um padrão de URL
Primeiro, crie um padrão de URL para editar uma postagem:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='posts'),
path('post/create', views.create_post, name='post-create'),
path('post/edit/<int:id>/', views.edit_post, name='post-edit'),
path('about/', views.about, name='about'),
]
Linguagem de código: Python ( python )
A URL da postagem de edição aceita um id como um número inteiro especificado pelo <int:id>
padrão. Por exemplo, se você editar a postagem com id 1, a URL será:
http://127.0.0.1/post/update/1/
Linguagem de código: Python ( python )
O Django passará o id (1) para o segundo argumento da edit_post()
função.
Se você passar um valor que não seja um número inteiro para a URL assim:
http://127.0.0.1/post/update/abcd/
Linguagem de código: Python ( python )
Django irá redirecionar para 404 porque não corresponde a nenhuma URL nos padrões de URL.
Definir uma função de visualização
Defina a edit_post()
função no views.py
arquivo:
from django.shortcuts import render,redirect, get_object_or_404
from django.contrib import messages
from .models import Post
from .forms import PostForm
def edit_post(request, id):
post = get_object_or_404(Post, id=id)
if request.method == 'GET':
context = {'form': PostForm(instance=post), 'id': id}
return render(request,'blog/post_form.html',context)
# other functions
Linguagem de código: Python ( python )
Como funciona:
Primeiro, importe get_object_or_404
a função do django.shortcuts
módulo:
from django.shortcuts import render,redirect, get_object_or_404
Linguagem de código: Python ( python )
A get_object_or_404()
função obtém um objeto por id ou redireciona para a página 404 se o id não existir.
Segundo, defina a
função que aceita um edit_post()
HttpRequest
objeto ( request
) e an id
como um número inteiro.
A
função executa as seguintes etapas:edit_post()
- Obtenha um
Post
objeto por id ou redirecione para a página 404 se o id não existir. - Crie um
PostForm
objeto e defina oinstance
argumento para opost
objeto. - Renderize o
post_form.html
modelo.
Terceiro, modifique o post_form.html
modelo para alterar o título do formulário. Atualmente, ele mostra Create Post
.
{% extends 'base.html' %}
{% block content %}
<h2>{% if id %} Edit {% else %} New {% endif %} Post</h2>
<form method="post" novalidate>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" />
</form>
{% endblock content %}
Linguagem de código: HTML, XML ( xml )
Se o id
(post id) estiver disponível, o formulário estará no modo de edição. Caso contrário, está em modo de criação. Com base nesta lógica, alteramos o título do formulário de acordo.
Quarto, modifique o home.html
modelo para incluir o link de edição em cada postagem:
{% extends 'base.html' %}
{% block content %}
<h1>My Posts</h1>
{% for post in posts %}
<h2>{{ post.title }}</h2>
<small>Published on {{ post.published_at | date:"M d, Y" }} by {{ post.author | title}}</small>
<p>{{ post.content }}</p>
<p><a href="{% url 'post-edit' post.id %}">Edit</a></p>
{% endfor %}
{% endblock content %}
Linguagem de código: HTML, XML ( xml )
Quinto, abra o URL da lista de postagens http://127.0.0.1/
, você verá uma lista de postagens com o link de edição em cada uma, conforme mostrado na imagem a seguir:
Se você clicar no link Editar para editar uma postagem, verá um formulário preenchido com valores de campo. Por exemplo, você pode editar a postagem “Plano é melhor que aninhado”, você verá o seguinte formulário:
Para editar a postagem, você altera os valores e clica no botão Salvar. No entanto, ainda não adicionamos o código que trata a solicitação HTTP POST.
Sexto, adicione o código que trata a solicitação HTTP POST, ou seja, quando o botão Salvar é clicado:
def edit_post(request, id):
post = get_object_or_404(Post, id=id)
if request.method == 'GET':
context = {'form': PostForm(instance=post), 'id': id}
return render(request,'blog/post_form.html',context)
elif request.method == 'POST':
form = PostForm(request.POST, instance=post)
if form.is_valid():
form.save()
messages.success(request, 'The post has been updated successfully.')
return redirect('posts')
else:
messages.error(request, 'Please correct the following errors:')
return render(request,'blog/post_form.html',{'form':form})
Linguagem de código: Python ( python )
Atualize a postagem anexando três asteriscos (***) ao título:
Clique no botão Salvar e você verá que a postagem será atualizada:
Baixe o código fonte do Projeto Django
Resumo
- Incluir
<int:id>
padrão em uma URL para criar uma URL de edição que aceite um ID de modelo como um número inteiro. - Use a
get_object_or_404()
função para obter um objeto por id ou redirecione para a página 404 se o objeto não existir. - Passe uma instância de modelo para um formulário de modelo para renderizar os campos do modelo.