Resumo : neste tutorial, você aprenderá como usar a CreateView
classe 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 CreateView
classe 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 CreateView
classe, você define uma classe que herda dela e adiciona alguns atributos e métodos.
Por exemplo, o seguinte usa a CreateView
classe 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 & functions
Linguagem de código: Python ( python )
Como funciona:
Primeiro, importe a CreateView
classe, a reverse_lazy()
função e messages
o módulo.
Segundo, defina a TaskCreate
classe que herda da CreateView
classe. Na CreateView
classe, definimos os seguintes atributos e métodos:
model
especifica 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 doTask
modelo.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
função. Oreverse_lazy()
aceita um nome de visualização e retorna um URL.reverse_lazy()
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 doform_valid()
método da superclasse.
Por padrão, a CreateView
classe usa o task_form.html
modelo com templates/todo
a seguinte convenção de nomenclatura:
model_form.html
Linguagem de código: Python ( python )
Se quiser usar um modelo diferente, você pode substituir o modelo padrão usando o template_name
atributo na TaskCreate
classe.
Criando o modelo task_form.html
Crie o task_form.html
no templates/todo
diretó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.py
aplicativo todo mapeando uma URL com o resultado do as_view()
método da TaskCreate
classe:
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.html
modelo do projeto para:
- Exiba as mensagens flash.
- Adicione o
New Task
link à 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
CreateView
para definir uma visão baseada em classe que cria um objeto.