Django CreateView

Resumo : neste tutorial, você aprenderá como usar a CreateViewclasse Django para definir uma visão baseada em classe que cria uma tarefa para o aplicativo Todo.

Este tutorial começa onde o  tutorial do Django DetailView  parou.

Definindo a classe CreateView

A CreateViewclasse permite criar uma visualização baseada em classe que exibe um formulário para criar um objeto, exibindo novamente o formulário com erros de validação e salvando o objeto no banco de dados.

Para usar a CreateViewclasse, você define uma classe que herda dela e adiciona alguns atributos e métodos.

Por exemplo, o seguinte usa a CreateViewclasse para definir uma visualização baseada em classe que renderiza um formulário para criar uma nova tarefa no aplicativo Todo :

# ..
from django.views.generic.edit import CreateView
from django.contrib import messages
from django.urls import reverse_lazy
from .models import Task

class TaskCreate(CreateView):
    model = Task
    fields = ['title','description','completed']
    success_url = reverse_lazy('tasks')
    
   
    def form_valid(self, form):
        form.instance.user = self.request.user
        messages.success(self.request, "The task was created successfully.")
        return super(TaskCreate,self).form_valid(form)

# other classes & functionsLinguagem de código:  Python  ( python )

Como funciona:

Primeiro, importe a CreateViewclasse, a reverse_lazy()função e messageso módulo.

Segundo, defina a TaskCreateclasse que herda da CreateViewclasse. Na CreateViewclasse, definimos os seguintes atributos e métodos:

  • modelespecifica a classe do objeto a ser criado ( Task).
  • fieldsé uma lista de campos exibidos no formulário. Neste exemplo, o formulário exibirá título, descrição e atributos preenchidos do Taskmodelo.
  • success_urlé a URL de destino para a qual o Django irá redirecionar assim que uma tarefa for criada com sucesso. Neste exemplo, redirecionamos para a lista de tarefas usando a reverse_lazy()função. O reverse_lazy()aceita um nome de visualização e retorna um URL.
  • form_valid()– é um método chamado assim que o formulário é postado com sucesso. Neste exemplo, definimos o usuário como o usuário atualmente logado, criamos uma mensagem flash e retornamos o resultado do form_valid()método da superclasse.

Por padrão, a CreateViewclasse usa o task_form.htmlmodelo com templates/todoa seguinte convenção de nomenclatura:

model_form.htmlLinguagem de código:  Python  ( python )

Se quiser usar um modelo diferente, você pode substituir o modelo padrão usando o template_nameatributo na TaskCreateclasse.

Criando o modelo task_form.html

Crie o task_form.htmlno templates/tododiretório com o seguinte código:

{%extends 'base.html'%}

{%block content%}

<div class="center">
	<form method="post" novalidate class="card">
	 	{%csrf_token %}
	 	
	 	<h2>Create Task</h2>
		{% for field in form %}
			{% if field.name == 'completed' %}
				<p>
					{{ field.label_tag }}
					{{ field }}
				</p>
				{% if field.errors %}
	        		<small class="error">{{ field.errors|striptags  }}</small> 
	        	{% endif %}
			{% else %}
	    		{{ field.label_tag }} 
	        	{{ field }}
	        	{% if field.errors %}
	        		<small class="error">{{ field.errors|striptags  }}</small> 
	        	{% endif %}
	        {% endif %}
		{% endfor %}
		
		<div class="form-buttons">
			<input type="submit" value="Save" class="btn btn-primary"/>
			<a href="{%url 'tasks'%}" class="btn btn-outline">Cancel</a>
		</div>
	</form>
</div>

{%endblock content%}Linguagem de código:  HTML, XML  ( xml )

No task_form.html, renderizamos os campos do formulário manualmente. Se quiser gerar o formulário automaticamente, você pode usar um dos seguintes atributos:

{{ form.as_p }}   # render the form as <p>
{{ form.as_div }} # render the form as <div>
{{ form.as_ul }}  # redner the form as <ul>Linguagem de código:  Python  ( python )

Definindo a rota

Adicione uma rota ao urls.pyaplicativo todo mapeando uma URL com o resultado do as_view()método da TaskCreateclasse:

from django.urls import path
from .views import home, TaskList, TaskDetail, TaskCreate

urlpatterns = [
    path('', home, name='home'),
    path('tasks/', TaskList.as_view(),name='tasks'),
    path('task/<int:pk>/', TaskDetail.as_view(),name='task'),
    path('task/create/', TaskCreate.as_view(),name='task-create'),
]Linguagem de código:  Python  ( python )

Exibindo mensagens flash e adicionando um link à navegação

Modifique o base.htmlmodelo do projeto para:

  • Exiba as mensagens flash.
  • Adicione o New Tasklink à navegação.
{%load static %}
<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="{% static 'css/style.css' %}" />
        <title>Todo List</title>
    </head>

    <body>
        <header class="header">
            <div class="container">
            	<a href="{%url 'home'%}" class="logo">Todo</a>
                <nav class="nav">
                	<a href="{% url 'home'%}"><i class="bi bi-house-fill"></i> Home</a>
                	<a href="{% url 'tasks' %}"><i class="bi bi-list-task"></i> My Tasks</a>
                	<a href="{% url 'task-create' %}"><i class="bi bi-plus-circle"></i> Create Task</a>
                </nav>
            </div>
        </header>
        <main>
            <div class="container">
            	{% if messages %}
				{% for message in messages %}
					<div class="alert alert-{{message.tags}}">
					       {{message}}
					     </div>
					   {% endfor %}
				{% endif %}
            
             {%block content %}
             {%endblock content%}
            </div>
        </main>
        <footer class="footer">
            <div class="container">
				<p>© Copyright {% now "Y" %} by <a href="https://tutorials.acervolima.com">Python Tutorial</a></p>
            </div>
        </footer>
    </body>

</html>
Linguagem de código:  HTML, XML  ( xml )

Execute o servidor de desenvolvimento Django e abra a URL http://127.0.0.1:8000/task/create/, você verá o seguinte formato:

Insira o título e a descrição e clique no botão Salvar. Você será redirecionado para a página da lista de tarefas com uma mensagem:

Você pode baixar o código final deste tutorial Django CreateView aqui.

Resumo

  • Use a classe Django CreateViewpara definir uma visão baseada em classe que cria um objeto.

Deixe um comentário

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