Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO BACK END I Fabiano Berlinck Neumann Formulários com Django Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Reconhecer a criação de formulários. � Implementar o arquivo forms.py. � Gerar um formulário automaticamente. Introdução Python é considerada uma linguagem de programação de fácil entendi- mento e sintaxe simples, sendo utilizada em diversas áreas na criação de pequenas aplicações. Quando a linguagem é utilizada em um framework Web como o Django, é possível criar aplicações completas, com a proposta de tornar o desenvolvimento mais ágil, da concepção à conclusão, assim como promover cuidados em relação à segurança e à escalabilidade. Além disso, o Django é considerado um dos mais populares entre os frameworks existentes. Por conta de sua arquitetura, para que seja possível criar aplicações no Django, é necessário que o desenvolvedor siga algumas orientações e convenções. Conhecer padrões como o model-view-controller e para- digmas como a programação orientada a objetos pode acelerar a curva de aprendizado e tornar mais simples a manipulação da estrutura de arquivos e pastas do projeto, bem como a ordem do código em cada um destes arquivos. Neste capítulo, você vai aprender sobre a criação de páginas com formulários, desde a base para todos os tipos de página até a estrutura específica do formulário. Além disso, você vai saber como implementar o arquivo que contém o modelo que representa os objetos do formulário e como gerar um formulário automaticamente. Criação de formulários Na programação de páginas com formulários no Django, assim como em outros frameworks Web, os desenvolvedores devem escrever o código em HTML e CSS para criar, estruturar e estilizar as páginas e seus componentes. Entretanto, de acordo com Pinheiro (2019), neste framework é possível diminuir boa parte da escrita em HTML e CSS com a geração de formulários de forma automatizada a partir de códigos escritos em Python. Os exemplos de código deste capítulo são modificações do projeto exem- plificado no tutorial Django Girls e abordam trechos de uma aplicação que gerencia uma lista de tarefas do usuário, especificamente, a tela com formulário de criação e edição de uma das tarefas. O trecho de código a seguir repre- senta o código do arquivo base das telas, chamado base.html, que contém os componentes que, com o uso do Django, não precisam ser repetidos na apresentação do formulário de criação e edição da tarefa, da lista de tarefas e de seus detalhes. {% load static %}<!-- código Python para carregar arquivos estáticos --> <html> <head> <title>Minha Lista de Tarefas</title> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/ bootstrap/3.2.0/css/bootstrap.min.css" /> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/ bootstrap/3.2.0/css/bootstrap-theme.min.css" /> <link href='//fonts.googleapis.com/css?family=Lobster&subs et=latin,latin-ext' rel='stylesheet' type='text/css' /> <link rel="stylesheet" href="{% static css/style.css %}"> </head> <body> <div class="page-header"> <a href="{% url 'task _ new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a> <h1><a href="/">Minha Lista de Tarefas</a></h1> </div> <div class="content container"> Formulários com Django2 <div class="row"> <div class="col-md-8"> {% block content %} {% endblock %} <!-- conteúdo do formulário e das demais páginas que utilizam o mesmo arquivo base por meio de código Python --> </div> </div> </div> </body> </html> Como é possível observar no código HTML, o título da aba do navegador é definido como Minha Lista de Tarefas na tag <title>; as duas primeiras tags <link> são utilizadas para adicionar o Bootstrap; a terceira tag <link> para adicionar a fonte Lobster e; a quarta, para adicionar a referência ao arquivo CSS de estilos, que terá seu valor convertido para um código Python exigido pelo Django para referenciar arquivos estáticos como o de estilos. Também serão adicionados códigos Python para carregar a área de conteúdo. Dentro do corpo da página existem dois grandes blocos <div>, um com a classe page-header e outro com a classe content container, que representam o cabeçalho da página e a área de conteúdo, respectivamente. No cabeçalho existem dois links: o primeiro envolve o ícone com o sinal de adição e possui referência em Python para a rota que carrega o formulário de nova tarefa para a área de conteúdo. O segundo está dentro da tag <h1>, o que permite ao usuário clicar no título para carregar a lista de tarefas. Saiba mais sobre o Bootstrap e conheça os componentes que podem ser aplicados por meio das classes das tags no link a seguir. https://qrgo.page.link/1iKcS 3Formulários com Django Tanto no arquivo base quanto no arquivo do formulário, apresentado a seguir e nomeado como task_edit.html, o formulário escrito em HTML não exige o conhecimento da linguagem Python ou do framework Django para ser compreendido, apesar de já conter algumas linhas em Python. <h2>Nova Tarefa</h2> <form method="POST" class="task-form"> <button type="submit" class="save btn btn-default">Criar</ button> </form> A tag <form> é utilizada com o método POST e possui um botão com estilos do Bootstrap para criar a nova tarefa. O código dos campos da tarefa não precisa ser escrito, já que os componentes serão criados automaticamente com o auxílio do framework Django e do código Python, que será adicionado a este arquivo nos tópicos a seguir. Além disso, é necessário criar uma função no arquivo views.py, que recebe uma requisição como parâmetro para renderizar os templates dos arquivos HTML, conforme apresentado a seguir. Arquivo views.py: from .forms import TaskForm def task _ new(request): form = TaskForm() return render(request, 'task _ edit.html', {'form': form}) A classe TaskForm() é atribuída à variável form para criar um novo formulário de tarefas e, assim, passá-lo para o template. Implementação do arquivo forms.py Para que o formulário seja criado automaticamente, além dos arquivos HTML é necessário implementar os formulários e os modelos da aplicação, ambos em Python, nos arquivos forms.py e models.py, respectivamente. Além disso, é necessário adicionar as novas rotas no arquivo urls.py para que o Django reconheça quais arquivos deve carregar e apresentar na área de conteúdo do arquivo base. Os três arquivos são apresentados a seguir. Formulários com Django4 Arquivo models.py: from django.db import models class Task(models.Model): title = models.CharField(max _ length=20, null=False) description = models.TextField() A classe tarefa (Task) possui duas propriedades, uma para o título e outra para o texto da descrição. A primeira é configurada como um campo obrigatório de texto, de no máximo 20 caracteres, e a segunda, como um campo de texto não obrigatório, sem limite fixo. Arquivo forms.py: from django import forms from .models import Task class TaskForm(forms.ModelForm): class Meta: model = Task fields = ('title', 'description',) Seria possível criar o formulário inteiro desde o seu princípio, mas neste exemplo utiliza-se o ModelForm, que usa o modelo para salvar o resultado do formulário, como o título e a descrição de cada tarefa. Observe que os valores da variável fields possuem o mesmo nome dos parâmetros do modelo Task. Arquivo urls.py: from django.urls import path from . import views urlpatterns = [ path('', views.task _ list, name='task _ list'), path('task/<int:pk>/', views.task _ detail, name='task _ detail'), path('task/new/', views.task _ new, name='task _ new'), ] 5Formulários com Django Neste arquivo foram configuradas as rotas possíveis para o usuário navegar na aplicação por meio do vetor urlpatterns e dos seus dois caminhos (path). A primeira rotapossui o caminho vazio e representa a rota padrão da aplicação, que também pode ser substituída por uma barra (/). A segunda rota diz respeito ao endereço que apresenta ao detalhe de uma tarefa, em que são apresentadas as informações de uma delas sem o formulário. Já a terceira se trata da rota do formulário que é criado automaticamente neste capítulo. Geração automática do formulário Quando uma aplicação possui muitos formulários e a maioria deles é padrão, programar as telas pode ser demorado, cansativo e, de certa forma, repetitivo, especialmente se cada formulário possuir múltiplos campos. Como apresentado anteriormente, no Django os formulários podem ser criados automaticamente a partir das classes modelo e suas definições, sem haver necessidade de se escrever todo o HTML. De acordo com a documentação oficial do projeto Django, se a aplicação precisar de banco de dados, possivelmente ela terá formulários que mapeiam esses modelos e suas propriedades, que definem os campos do modelo para automatizar o processo por meio da criação das classes de formulário a partir dos modelos Django. O controle da classe de formulário e a renderização dos componentes são feitos pela camada view do Django (neste caso, com o arquivo views.py), suas propriedades e seus métodos, conforme apresentado a seguir. from .forms import TaskForm def task _ new(request): form = TaskForm() return render(request, 'task _ edit.html', {'form': form}) Com o TaskForm() é possível instanciar um novo formulário de tarefas na variável form e passá-lo para o template como terceiro parâmetro do método render(). Formulários com Django6 Além disso, para o Django gerenciar o que será renderizado e seu local, é necessário adicionar o código Python no arquivo task_edit.html para informar qual é o arquivo base com {% extends 'base.html' %} e qual é o bloco de conteúdo com início em {% block content %} e fim em {% endblock %}, conforme apresentado a seguir. {% extends 'base.html' %} {% block content %} <h2>Nova Tarefa</h2> <form method="POST" class="task-form">{% csrf _ token %} {{ form.as _ p }} <button type="submit" class="save btn btn-default">Save</ button> </form> {% endblock %} Para exibir o formulário, utiliza-se o {{ form.as_p }} e, para a segurança, o {% csrf_token %}. Entretanto, desta forma os dados não persistem, ou seja, não são armazenados no banco de dados. Para isso é necessário verificar se o formulário é válido com o método is_valid() e salvá-lo com o método form.save() na classe de controle views.py, conforme apresentado a seguir. from django.shortcuts import redirect def task _ new(request): if request.method == "POST": form = TaskForm(request.POST) if form.is _ valid(): task = form.save(commit=False) task.save() return redirect('task _ detail', pk=task.pk) else: form = TaskForm() return render(request, 'task _ edit.html', {'form': form}) 7Formulários com Django Com o código anterior é possível guardar os dados digitados pelo usuário, quando se trata de uma tarefa nova, além de redirecionar para a página de detalhe da tarefa com o objeto tarefa criado por conta do redirect('task_ detail', pk=task.pk, caso o método da requisição seja POST, de forma que o identificador do objeto criado é passado para o atributo pk, que representa o campo de chave primária (primary key). Para que seja possível editar uma tarefa no formulário, é necessário adicio- nar o método task_edit, bastante parecido com o método de nova tarefa, também na classe views.py. Observe o código apresentado a seguir. def task _ edit(request, pk): task = get _ object _ or _ 404(Task, pk=pk) if request.method == "POST": form = TaskForm(request.POST, instance=task) if form.is _ valid(): task = form.save(commit=False) task.save() return redirect('task _ detail', pk=task.pk) else: form = TaskForm(instance=task) return render(request, 'task _ edit.html', {'form': form}) Neste método, a variável task recebe o resultado do método get_ob- ject_or_404(), que recebe Task como primeiro parâmetro e pk como segundo, que é a chave primária do objeto. Esse resultado pode ser o objeto em questão ou o erro 404, caso não encontre. Em seguida, a variável task é utilizada na criação do formulário de edição como referência para a instância do objeto do formulário. Caso seja necessário verificar se o usuário está autenticado, é possível utilizar o comando a seguir entre as tags que devem aparecer se o usuário tiver permissão para visualizar. {% if user.is _ authenticated %} ... {% endif %} Formulários com Django8 Caso o desenvolvedor também queira armazenar quem foi o usuário que criou a tarefa, é necessário adicionar a propriedade a seguir no arquivo mo- dels.py, especificamente, na classe Task. author = models.ForeignKey(settings.AUTH _ USER _ MODEL, on _ delete=models.CASCADE) Além disso, para salvar o usuário na submissão do formulário, é necessário adicionar a linha de código a seguir, que recupera o usuário que fez a requi- sição nos métodos task_new() e task_edit() do arquivo views.py, dentro do bloco do condicional form.is_valid(),característica comum tanto à criação de uma nova tarefa quanto à edição de uma tarefa existente. if form.is _ valid(): task = form.save(commit=False) task.author = request.user task.save() return redirect('task _ detail', pk=task.pk) Desta forma, é possível criar a parte do projeto que gera formulários au- tomaticamente para os primeiros cadastros na base de dados, populando o banco antecipadamente, como no caso de colaboradores cadastrando produtos e serviços enquanto as outras partes do sistema ainda estão em desenvolvimento, possibilitando que tanto o framework quanto os processos de desenvolvimento do negócio em que o aplicativo está inserido sejam ágeis. Neste capítulo foi apresentada a criação de um formulário automático com o Django. No entanto, é possível que você queira criar um aplicativo em React ou React Native e precise conectar o servidor ao projeto mobile. Você pode utilizar o Django Rest para criar a API, como é possível observar nos links a seguir. https://qrgo.page.link/AZMfX https://qrgo.page.link/QFaFZ 9Formulários com Django PINHEIRO, F. Criando formulários automaticamente com Django. TreinaWeb, São Paulo, 16 jan. 2019. Disponível em: https://www.treinaweb.com.br/blog/criando-formularios- -automaticamente-com-django/. Acesso em: 17 nov. 2019. Leituras recomendadas CREATING forms from models. Django Software Foundation, [S. l.], 2019. Disponível em: https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/. Acesso em: 17 nov. 2019. DJANGO Web Framework (Python). MDN Web Docs, Mountain View, 2019. Disponível em: https://developer.mozilla.org/pt-BR/docs/Learn/Server-side/Django. Acesso em: 17 nov. 2019. FORMS. Bootstrap Team, [S. l.], [2019]. Disponível em: https://getbootstrap.com/docs/4.0/ components/forms/. Acesso em: 17 nov. 2019. FORMULÁRIOS do Django. Django Girls Foundation, London, [2019]. Disponível em: https://tutorial.djangogirls.org/pt/django_forms/. Acesso em: 17 nov. 2019. FULL Stack React & Django [1] - Basic REST API. [S. l.: S. n.], 2019. 1 vídeo (22 min 41 s). Publicado pelo canal Traversy Media. Disponível em: https://youtu.be/Uyei2iDA4Hs. Acesso em: 17 nov. 2019. GUIA de Python com Django. DevMedia, Rio de Janeiro, 2019. Disponível em: https:// www.devmedia.com.br/guia/programador-python-com-django/38791. Acesso em: 17 nov. 2019. TUTORIAL Django Girls. Django Girls Foundation, London, [2019]. Disponível em: https:// tutorial.djangogirls.org/pt/. Acesso em: 17 nov. 2019. TUTORIAL: Django REST with React (Django 2.0 and a sprinkle of testing). Valentino Gagliardi, [S. l.], 12 Mar. 2018. Disponível em: https://www.valentinog.com/blog/drf/. Acesso em: 17 nov. 2019. ReferênciaOs links para sites da Web fornecidos neste capítulo foram todos testados, e seu fun- cionamento foi comprovado no momento da publicação do material. No entanto, a rede é extremamente dinâmica; suas páginas estão constantemente mudando de local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade sobre qualidade, precisão ou integralidade das informações referidas em tais links. Formulários com Django10
Compartilhar