Verificando dois campos
Parte da seção Forms do Journey de Django da Coddy. Lição 11 de 20.
A Feira do Livro de Inverno dura três dias, e o fim não pode ocorrer antes do início. Um método clean_<field> verifica um campo, então uma regra entre campos fica em clean(), que é executado depois das verificações próprias de cada campo. Um formulário de reserva em que um grupo com mais de 6 pessoas precisa informar um número de telefone:
def clean(self):
cleaned_data = super().clean()
guests = cleaned_data.get("guests")
phone = cleaned_data.get("phone")
if guests and guests > 6 and not phone:
self.add_error("phone", "Groups over 6 need a phone number.")
return cleaned_dataUm campo que falhou está ausente de cleaned_data, e uma data opcional vazia é None, então leia com .get() e compare somente quando ambos os valores estiverem disponíveis.
self.add_error() coloca uma mensagem abaixo de um campo. Lançar forms.ValidationError em clean() gera um erro no formulário inteiro, que nenhum campo exibe: quem faz isso é {{ form.non_field_errors }}.
Desafio
Médio- Adicione
end_dateaEventFormdepois dedate: uma data que pode ficar vazia. - Recuse uma data de término anterior à de início com
The event cannot end before it starts., um erro do formulário inteiro. - Salve
end_dateemnew_event. - Exiba os erros do formulário inteiro acima dos campos.
Pressione Run e tente inserir uma data de término anterior à de início.
Experimente você mesmo
import datetime
from django import forms
class EventForm(forms.Form):
title = forms.CharField(max_length=100)
date = forms.DateField()
place = forms.CharField(max_length=100)
description = forms.CharField(widget=forms.Textarea, required=False)
capacity = forms.IntegerField(min_value=1)
def clean_date(self):
date = self.cleaned_data["date"]
if date < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past.")
return date
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Forms
2Formulários do Django
Um formulário do DjangoCriando um formulárioPratique por conta própria: Playground de Django