Formulário de edição do Django

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.pyarquivo:

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_404a função do django.shortcutsmódulo:

from django.shortcuts import render,redirect, get_object_or_404Linguagem 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 edit_post()função que aceita um HttpRequestobjeto ( request) e an idcomo um número inteiro.

A edit_post()função executa as seguintes etapas:

  • Obtenha um Postobjeto por id ou redirecione para a página 404 se o id não existir.
  • Crie um PostFormobjeto e defina o instanceargumento para o postobjeto.
  • Renderize o post_form.htmlmodelo.

Terceiro, modifique o post_form.htmlmodelo 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.htmlmodelo 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:

formulário de edição do Django - adicionar link de edição

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *