Menu
CoddyTech

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_data

Um 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.

challenge icon

Desafio

Médio

Os eventos passam a ter uma data de término.

  1. Em events/forms.py, adicione um campo de data opcional end_date a EventForm. Escreva clean(): quando as duas datas estiverem preenchidas e a data de término vier primeiro, gere The event cannot end before it starts. Leia as datas com .get().
  2. Em new_event, salve também end_date.
  3. Em new_event.html, exiba form.non_field_errors antes 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
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Playground de Django