Menu
CoddyTech

Un evento completo

Parte de la sección Formularios del Journey de Django de Coddy. Lección 17 de 20.

La clase de cerámica tiene 2 plazas y 2 invitados, pero su formulario todavía admite más. La regla debe estar en el formulario, pero solo la vista sabe para qué evento es el formulario.

Un formulario es una clase, así que puede recibir más argumentos. Recibe el tuyo como argumento con nombre en __init__, guárdalo en self y pasa el resto al __init__ de Django. Un formulario de puja que necesita el artículo de la subasta:

class BidForm(forms.Form):
    amount = forms.IntegerField()

    def __init__(self, *args, item=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.item = item

    def clean_amount(self):
        amount = self.cleaned_data["amount"]
        if amount <= self.item.top_bid:
            raise forms.ValidationError("Bid more than the top bid.")
        return amount

La vista pasa el artículo cada vez que crea el formulario: BidForm(request.POST, item=item). Nombrar item en la firma evita que termine en **kwargs; el formulario de Django no lo conoce y generaría un TypeError.

challenge icon

Desafío

Intermedio

Rechaza las confirmaciones de asistencia a un evento completo con Sorry, this event is full.:

  • Pasa el evento a RSVPForm como argumento con nombre event y úsalo al validar el formulario completo.
  • Un evento al que le queda una plaza todavía admite a un invitado más.
  • Pasa el evento dondequiera que event_detail cree el formulario.

Pulsa Run y confirma tu asistencia a la clase de cerámica.

Pruébalo tú mismo

import datetime

from django import forms

from .models import RSVP, Event


class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ["title", "date", "end_date", "place", "description", "capacity"]

    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

    def clean(self):
        cleaned_data = super().clean()
        date = cleaned_data.get("date")
        end_date = cleaned_data.get("end_date")
        if date and end_date and end_date < date:
            raise forms.ValidationError("The event cannot end before it starts.")
        return cleaned_data


class RSVPForm(forms.ModelForm):
    class Meta:
        model = RSVP
        fields = ["name", "email"]
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Formularios

Practica por tu cuenta: Playground de Django