Menu
CoddyTech

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_data

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

challenge icon

Desafio

Médio
  • Adicione end_date a EventForm depois de date: 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_date em new_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
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