Estoy haciendo una encuesta simple construida alrededor de un modelo:
modelos.py
class Fruits(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) title = models.CharField(max_length=200, default='') text = models.TextField(default='') banana = models.BooleanField(default=False) grape = models.BooleanField(default=False) apple = models.BooleanField(default=False) mango = models.BooleanField(default=False)formularios.py
class FruitPicker(ModelForm): class Meta: model = Fruits fields = [ 'title', 'text', 'banana', 'grape', 'apple', 'mango' ] widgets = { 'text': forms.Textarea(attrs={"style": "height:10em;" "width:60em;"}), 'banana': forms.CheckboxInput(attrs={"style": "margin-left:350px;"}), 'grape': forms.CheckboxInput(attrs={"style": "margin-left:350px;"}), 'apple': forms.CheckboxInput(attrs={"style": "margin-left:350px;"}), 'mango': forms.CheckboxInput(attrs={"style": "margin-left:350px;"}) }Ahora digamos que quiero asegurarme de que el usuario tiene que seleccionar una cantidad mínima de 2 frutas, pero una cantidad máxima de 3. ¿Cómo haría esto en el back-end?
Puede anular el método de clean del formulario para verificar si se verifican entre dos y tres BooleanField s:
from django.core.exceptions import ValidationError class FruitPicker(ModelForm): # ⋮ def clean (self, *args, **kwargs): data = super().clean(*args, **kwargs) total = sum([data[x] for x in ['banana', 'grape', 'apple', 'mango']]) if not (2 <= total <= 3): raise ValidationError('You should select between 2 and 3 fruits.') return data Aquí sum(…) suma los bool booleanos y usa 0 para False y 1 para True , por lo que cuenta el número de True . Si ese número no está entre 2 y 3 , genera un ValidationError .