Verificando dois campos
Parte da seção Forms do Journey de Django da Coddy. Lição 11 de 20.
A Feira de Livros 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 que envolve vários 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:
raise forms.ValidationError("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 apenas quando ambos os valores estiverem presentes.
Um erro gerado em clean() pertence ao formulário inteiro, então o loop dos campos não o exibe. {{ form.non_field_errors }} exibe.
Desafio
MédioOs eventos passam a ter uma data de término.
- Em
events/forms.py, adicione um campo de data opcionalend_dateaEventForm. Escrevaclean(): quando as duas datas estiverem preenchidas e a data de término vier primeiro, gereThe event cannot end before it starts.Leia as datas com.get(). - Em
new_event, salve tambémend_date. - Em
new_event.html, exibaform.non_field_errorsantes do loop.
Defina a data de término antes da data de início: você verá essa mensagem.
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