2 votes

J'ai besoin d'aide pour comprendre les validateurs de formulaires de Django.

J'ai lu la documentation de Django ici : http://docs.djangoproject.com/en/dev/ref/forms/validation/

J'ai également parcouru un certain nombre de résultats de recherche sur Google et Stack Overflow, mais je n'ai pas réussi à répondre à mes questions ci-dessous.

Par exemple, disons que j'ai un modèle nommé "Widgets" avec un CharField nommé "product_name". Imaginons maintenant que je souhaite restreindre les caractères autorisés dans "nom_produit" à [a-zA-Z0-9] plus les apostrophes, les tirets et les traits de soulignement (c'est-à-dire ' - _) et afficher une erreur de formulaire à l'utilisateur s'il saisit un caractère restreint.

D'après les recherches ci-dessus, j'en déduis que je dois créer une fonction de validation quelque part pour vérifier la présence de ces caractères.

Mes questions spécifiques :
1. Quelle est la meilleure pratique quant à l'emplacement d'une fonction de validation comme celle-ci dans mon projet Django ?
2. D'où dois-je appeler cette fonction de validation ?
3. Comment afficher une erreur à l'utilisateur si un "mauvais" caractère est saisi ?
4. Quelqu'un pourrait-il avoir l'amabilité de poster un exemple de fonction de validation ?

Merci, j'apprécie toute aide que vous pouvez m'apporter.

3voto

Manoj Govindan Points 24030

Allez avec la réponse de Chefsmart si vous le pouvez. Voici un exemple de fonction de validation au cas où cela vous aiderait :

class MyCustomInvoiceForm(forms.Form):
    serial_number = forms.IntegerField(min_value = 1, initial = 1)
    # Other fields. I am interested in serial_number. 

    def clean_serial_number(self):
        serial_number = self.cleaned_data.get('serial_number')
        if not serial_number:
            return

        return _my_custom_validation(serial_number)

    def _my_custom_validation(self, serial_number):
        serial_number = int(serial_number)
        if not ((serial_number - 1) % 10 == 0):
            message = "Serial number should be 1 or one greater than a multiple of 10 (Example: 1, 11, 21 etc.)"
            raise forms.ValidationError(message)
        return serial_number

Voici un extrait de code d'un projet que j'ai réalisé. Le client avait besoin d'une logique de vérification intéressante pour le numéro de série.

2voto

chefsmart Points 2368

Si vous utilisez un formulaire Django, vous avez la possibilité d'utiliser un RegexField pour votre champ product_name. Voir http://docs.djangoproject.com/en/1.2/ref/forms/fields/#regexfield

Ce serait l'approche la plus propre pour votre situation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X