1
resposta

[Dúvida] configuração dos campos

1- Caso eu tenha um models com um IntegerField e utilize o NumberInput para criar o modelForm, como faço pra não permitir que o usuário coloque também números negativos?

2- Em um campo de select onde tenho alguns tamanhos como faço pra ficar na mesma ordem que coloquei no models p, pp, m, g...?


# models.py
    TAMANHOS_DISPONIVEIS = {
        ("P", "p"),
        ("PP", "pp"),
        ("M", "m"),
        ("G", "g"),
        ("GG", "gg"),
        ("XG", "xg"),
    }
    quantidade = models.IntegerField(null=False, blank=False, default=0)
    tamanho = models.CharField(max_length=2, null=False, blank=False, choices=TAMANHOS_DISPONIVEIS, default='')
    
# form
        widgets = {
            "quantidade": forms.NumberInput(attrs={"class": "form-control"}),
             "tamanho": forms.Select(attrs={"class": "form-select"})
            }
1 resposta

E aí, Kayo! Beleza?

Evitar números negativos com NumberInput:Para garantir que o campo IntegerField não aceite números negativos, você pode adicionar validações ao seu ModelForm. Uma maneira simples é usar MinValueValidator durante a definição do campo no models.py.

from django.core.validators import MinValueValidator

class SeuModel(models.Model):
    quantidade = models.IntegerField(
        null=False, 
        blank=False, 
        default=0,
        validators=[MinValueValidator(0)]
    )

Ao fazer isso, o IntegerField será validado para garantir que o valor inserido seja pelo menos 0. Manter a ordem dos tamanhos no campo select:A ordem das opções no campo select é determinada pela ordem em que você define as escolhas no seu campo CharField (ou IntegerField com choices). Você já fez isso corretamente no seu código. Quando você define o campo tamanho assim:

tamanho = models.CharField(max_length=2, null=False, blank=False, choices=TAMANHOS_DISPONIVEIS, default='')

A ordem que você definiu na constante TAMANHOS_DISPONIVEIS é a ordem que aparecerá no formulário. Portanto, a ordem "P", "PP", "M", "G", "GG", "XG" será respeitada no seu select.