Limaces dans la validation d'un Django
-
06-09-2019 - |
Question
Je suppose que cela va impliquer regexp ou quelque chose, mais je vais donner un coup de feu. A la minute, un utilisateur peut briser un site Web en tapant quelque chose de similaire à £$(*£$(£@$&£($
dans le champ du titre, qui est converti en une limace en utilisant Django slugify
.
Étant donné qu'aucun de ces caractères peut être converti, Django renvoie une erreur. Ma question est, que dois-je mettre dans la méthode de validation de formulaire pour élever un forms.ValidationError
lorsque l'utilisateur utilise un titre comme celui-ci?
Merci.
La solution
Cette question est vieille d'une demi-décennie de sorte à mettre à jour ma question, je dois préciser que je suis au moins un signe de tête au passé où certaines fonctionnalités pourraient ne pas avoir existé.
La meilleure façon de gérer les limaces dans les formes ces jours-ci est d'utiliser juste django.models.SlugField
. Il se valider pour vous et laisser entendre que ce domaine est un indice.
Si vous ne l'utilisez ceci sur un modèle, vous pouvez toujours accrocher dans le même validateur que SlugField utilise:
from django.core.validators import validate_slug
slug = forms.CharField(..., validators=[validate_slug])
Si vous voulez juste faire derrière les coulisses de vérification ou d'écrire votre propre validateur, vous pouvez utiliser une technique similaire à tirer dans la définition de Django d'une limace valide. Il est juste le regex compilé validate_slug ci-dessus utilise:
from django.core.validators import slug_re
if slug_re.match(...):
...
Je ne peux pas imaginer cela va changer, mais par vous-même de verrouillage à l'idée de Django d'une limace, vous assurer la cohérence si Django ne change un jour.
Autres conseils
SLUG_REGEX = re.compile('^[-\w]+$')