Olá,
Eu estou gostando bastante do curso, e nem sei se eu tenho uma dúvida.
Aqui no meu computador, quando o usuário comete um erro, as informações da data de ida e da data de volta somem do formulário, mas no formulário do instrutor os campos continuam preenchidos. Eu fiz alguma coisa errada ou isso depende do sistema operacional, navegador e afins? Coloco uma figura abaixo para ilustar.
Código do arquivo form.py
from django import forms
from django.forms.widgets import Textarea
from tempus_dominus.widgets import DatePicker
from datetime import datetime
from .classes_viagem import tipo_classe
from passagens.models import Passagem, ClasseViagem, Pessoa
class PassagensForms(forms.ModelForm):
data_pesquisa = forms.DateField(
label='Data da pesquisa', disabled=True, initial=datetime.today())
class Meta:
model = Passagem
fields = '__all__'
labels = {
'data_ida': 'Data de ida',
'data_volta': 'Data de volta',
'informacoes': 'Informações',
'classe_viagem': 'Classe do voô',
}
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')
list_errors = {}
has_number(origem, 'origem', list_errors)
has_number(destino, 'destino', list_errors)
is_equal(origem, destino, list_errors)
is_date_ida_greater_date_volta(data_ida, data_volta, list_errors)
is_date_smaller_than_today(data_ida, data_pesquisa, list_errors)
if bool(list_errors):
for field, msg in list_errors.items():
self.add_error(field, msg)
return self.cleaned_data
class PessoaForms(forms.ModelForm):
class Meta:
model = Pessoa
exclude = ['nome']
def is_equal(destino, origem, list_errors):
"""Check if 'destino' and 'origem are equal'
Args:
destino ([str]): string indicating the 'Origem' city
origem ([str]): string indicating the 'Destino' city
list_errors ([dict]): global list with errors messages
"""
if destino == origem:
list_errors['destino'] = '"Origem" and "Destino" must be different.'
def has_number(field_value, field_name, list_errors):
"""Check if a field has number.
Args:
field_value ([str]): value of the field where we will check if there is any number
field_name ([str]): name of field
list_errors ([dict]): global list with errors messages
"""
if any(char.isdigit() for char in field_value):
list_errors[field_name] = f'"{field_name}" can not have numbers.'
def is_date_ida_greater_date_volta(ida, volta, list_errors):
"""Check if ida <= volta
Args:
ida ([datetime]): datetime of ida
volta ([dateime]): datetime of volta
list_errors ([dict]): global list with errors messages
"""
if ida > volta:
list_errors['data_volta'] = 'date "ida" must be smaller or equal than data "volta"'
def is_date_smaller_than_today(data_ida, data_pesquisa, list_errors):
"""Check if date of 'ida' is greater or equal than today
Args:
data_ida ([datetime]): datetime of ida
data_pesquisa ([datetime]): datetime of volta
list_errors ([dict]): global list with erros messages
"""
if data_ida < data_pesquisa:
list_errors['data_ida'] = 'date "ida" must be greater or equal than today'
Código do arquivo views.py
from django.shortcuts import render
from passagens.forms import PassagensForms, PessoaForms
# Create your views here.
def index(request):
form = PassagensForms()
pessoa = PessoaForms()
dados = {
'form': form,
'pessoa_form': pessoa,
}
return render(request, 'index.html', dados)
def revisao_consulta(request):
if request.method == 'POST':
form = PassagensForms(request.POST)
pessoa_form = PessoaForms(request.POST)
if form.is_valid():
dados = {
'form': form,
'pessoa_form': pessoa_form,
}
return render(request, 'minha_consulta.html', dados)
else:
dados = {
'form': form,
'pessoa_form': pessoa_form,
}
return render(request, 'index.html', dados)