1
resposta

Classe de vôo na minha_consulta.html não apresenta o texto

Por favor, pode me ajudar a entender o que fiz de diferente, no caso do campo "Classe de vôo", pois o texto que é apresentado no resultado da consulta é ECON e não Econômica. Abaixo abro o meu código para analise.

classe_viagem.py

from django.db import models
from django.utils.translation import gettext_lazy as _

class ClasseViagem(models.TextChoices):
        ECONOMICA = 'ECON', _('Econômica')
        EXECUTIVA = 'EXEC', _('Executiva')
        PRIMEIRA_CLASSE = 'PRIC', _('Primeira Classe')

minha_consulta.html

{% extends "base.html" %} <!-- Herdar o trecho html -->
{% block content %}
<section class="col-8">
    <p>Sua origem é: {{ form.origem.value }}</p>
    <p>Seu destino é: {{ form.destino.value }}</p>
    <p>Sua data de ida é: {{ form.data_ida.value }}</p>
    <p>Sua data de volta é: {{ form.data_volta.value }}</p> 
    <p>Pesquisa realizada: {{ form.data_pesquisa.value }}</p>
    <p>Classe de vôo    : {{ form.classe_viagem.value }}</p>
    <p>Informações extras: {{ form.informacoes.value }}</p>
    <p>Email: {{ pessoa_form.email.value }}</p>
</section>
{% endblock %}

views.py

from django.shortcuts import render
from passagens.forms import PassagemForms, PessoaForms

def index(request):
    form = PassagemForms()
    pessoa_form = PessoaForms()
    contexto = {'form': form, 'pessoa_form':pessoa_form}
    return render(request, 'index.html', contexto)

def revisao_consulta(request):
    if request.method == 'POST':
        form = PassagemForms(request.POST)
        pessoa_form = PessoaForms(request.POST)
        if form.is_valid():
            contexto = {'form': form, 'pessoa_form':pessoa_form}
            return render(request, 'minha_consulta.html', contexto)
        else:
            print('Form Inválido')
            contexto = {'form': form}
            return render(request, 'index.html', contexto)

forms.py

from tkinter import Widget
from django import forms
from django.forms import Textarea
from tempus_dominus.widgets  import  DatePicker 
from datetime import datetime
from passagens.classe_viagem import tipos_de_classe
from passagens.validation import *
from passagens.models import Passagem, ClasseViagem, Pessoa, pessoa

class PassagemForms(forms.ModelForm):

    data_pesquisa = forms.DateField(label='Data da pesquisa', disabled=True, initial=datetime.today)
    class Meta: 
        model = Passagem
        # fields = ['origem', 'destino', 'data_ida', 'data_volta','classe_viagem', 'informacoes'] ou usar o menos trabalhoso
        fields = '__all__'
        labels = {'data_ida':'Data de ida','data_volta':'Data de volta', 'classe_viagem':'Classe do vôo','informacoes':'Informações'}
        widgets = {'data_ida':DatePicker(),'data_volta':DatePicker()}


    def clean(self):
        origem = self.cleaned_data.get('origem')
        destino = self.cleaned_data.get('destino')
        data_ida = self.cleaned_data.get('data_ida')
        data_volta = self.cleaned_data.get('data_volta')
        data_pesquisa = self.cleaned_data.get('data_pesquisa')
        lista_de_erros = {}
        campo_tem_algum_numero(origem,'origem', lista_de_erros)
        campo_tem_algum_numero(destino,'destino', lista_de_erros)
        origem_destino_iguais(origem, destino, lista_de_erros)
        data_ida_maior_que_data_volta(data_ida, data_volta, lista_de_erros)
        data_ida_menor_que_hoje(data_ida, data_pesquisa, lista_de_erros)
        if lista_de_erros is not None:
            for erro in lista_de_erros:
                mensagem_erro = lista_de_erros[erro]
                self.add_error(erro, mensagem_erro)
        return self.cleaned_data

class PessoaForms(forms.ModelForm):
    class Meta: 
        model = Pessoa
        exclude = ['nome']

index.html

{% extends "base.html" %} <!-- Herdar o trecho html -->
{% block content %}
{% load widget_tweaks %}

    <form action="{% url 'minha_consulta'%}" method="post">
        {% csrf_token %}  <!-- Nova pagina em outro lugar {{ form }} -->
        {% for field in form.visible_fields %}
        <div class="form-group">
            <label for="{{field.id_for_label}}">{{field.label}}</label>
            {{field|add_class:'form-control'}}  
        </div>
        {% for error in field.errors %}
        <section class="alert alert-danger" role="alert">
            {{ field.errors }}
        </section>
        {% endfor %}
        {% endfor %}
        {% for field in pessoa_form.visible_fields %}
        <div class="form-group">
            <label for="{{field.id_for_label}}">{{field.label}}</label>
            {{field|add_class:'form-control'}}  
        </div>
        {% endfor %}
        <input type="submit" value="Ok" class="btn btn-success">
    </form> 
{% endblock %}
1 resposta

Olá, tudo bem com você?

A apresentação do resultado da consulta com o texto ECON está correta, é o esperado para o código que temos. Com ele, no momento em que acessamos a página minha_consulta.html será impresso o valor do campo classe_viagem, esse valor é representado pelo primeiro item da tupla declarado com campo do tipo choices, nesse caso, ao escolhermos a classe econômica, será buscado a string ECON, da seguinte tupla: ECONOMICA = 'ECON', _('Econômica').

Caso queira apresentar um texto legível por humanos, será necessário realizarmos algumas modificações.

Quando trabalhamos com campos do tipo choices temos disponível o método get_<nome_do_campo>_display esse método será responsável por retornar de forma legível o valor presente nos campos do tipo choices.

Usando o método descrito acima será impresso o segundo valor da tupla cadastrada no arquivo passagens/models/classe_viagem.py na classe ClasseViagem. Onde temos o cadastro das opções de escolha:

class ClasseViagem(models.TextChoices):
        ECONOMICA = 'ECON', _('Econômica')
        EXECUTIVA = 'EXEC', _('Executiva')
        PRIMEIRA_CLASSE = 'PRIC', _('Primeira Classe')

Aplicando o uso do método get_classe_viagem_display para buscarmos o valor escolhido para o campo Classe do vôo, será impresso o valor presente entre os parênteses _('nome_da_classe').

Para fazermos uso desse método, será necessário apenas modificarmos o modo que apresentamos o resultado no arquivo template/minha_consulta.html. Ficando da seguinte forma.

<p>A classe de vôo: {{ form.instance.get_classe_viagem_display }}</p>

Acima temos o instance que será a referência para a classe responsável pela criação do campo do tipo choices, nesse caso instance representa a classe Passagem criada no arquivo passagens/models/passagem.py.

Realizando a mudança apresentada acima, teremos como resultado a apresentação de um texto legível por humanos.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!