Je viens de découvrir que Django n'entraîne pas automatiquement des espaces supplémentaires des intrants de champ de formulaire, et je pense que je comprends bien la justification (les «cadres ne devraient pas modifier l'entrée de l'utilisateur»).
Je pense que je sais que je sais Comment éliminer l'excès de WhitSpace à l'aide de Python's Re: P>
#data = re.sub('\A\s+|\s+\Z', '', data)
data = data.strip()
data = re.sub('\s+', ' ', data)
8 Réponses :
Que diriez-vous d'ajouter cela au Pour plus de documentation Voir:
https://docs.djangoproject.com/fr/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-acher-autre P> Votre La méthode pourrait ressembler à quelque chose comme ceci: p> def propre (auto): code> dans le formulaire?
Vous pouvez utiliser data = data.strip () code> au lieu de ces deux premières lignes (laides).
@Arthur - Devriez-vous également appeler à_python (), Valider () et Run_Validators () également dans la zone Nettoyable?
nettoyé_data = super (votreformclass, auto) .Clean (), comme la ligne 1 maintient le comportement des parents
Dans ce cas, il pourrait être utile de créer votre propre champ de formulaire (ce n'est pas si difficile tel qu'il sonne). Dans la méthode citant la documentation: p>
Vous pouvez facilement créer des classes de terrain personnalisées. Pour ce faire, créez un
Sous-classe de Django.Forms.field. Ses seules conditions sont que cela
mettre en œuvre une méthode propre () et que sa méthode __init __ () accepte la
Arguments de base (obligatoire, étiquette, initiale, widget,
help_text). P>
blockQuote>
plus à propos de ce sujet: https: // DOCS .djangoproject.com / fr / 1.3 / Ref / Formulaires / champs / # Création de champs personnalisés P> Clean () CODE>, vous supprimez ces espaces sures. P>
Cela a l'air très prometteur! Cela pourrait aborder le problème plus proche de la source telle qu'elle était. Cependant, j'utilise des modelforms, et donc pour changer le champ de formulaire associé à chaque champ modèle, je devrais "redéclaré" tous les champs modifiés dans la spécification de formulaire. Y a-t-il un moyen de contourner ceci? Devrais-je personnaliser le champ modèle également pour utiliser le champ de formulaire modifié?
Un moyen de faire cela consiste à spécifier un widget de formulaire personnalisé que les bandes blanchies: puis pour l'utiliser dans votre modelForm: p> Vous pouvez toujours créer votre propre non- modelform code> s. p> modelform code> formulaires et contrôler tous les aspects du champ et de la validation de cette façon. p> modelform code> S ajoute des vérifications pour les valeurs qui violeraient les contraintes de la DB; Donc, si le champ peut accepter 'hello' code> comme entrée valide, is_valid () code> n'aurait aucune raison de dépouiller les sucres (car il ne ferait pas de nettoyer arbitraire Logic, en plus de ce que vous avez mentionné "Crayws ne doit pas modifier l'entrée de l'utilisateur"). P> P>
Créez un champ modèle personnalisé de sorte que votre champ de formulaire personnalisé soit utilisé automatiquement.
class TrimmedCharFormField(forms.CharField):
def clean(self, value):
if value:
value = value.strip()
return super(TrimmedCharFormField, self).clean(value)
# (If you use South) add_introspection_rules([], ["^common\.fields\.TrimmedCharField"])
class TrimmedCharField(models.CharField):
__metaclass__ = models.SubfieldBase
def formfield(self, **kwargs):
return super(TrimmedCharField, self).formfield(form_class=TrimmedCharFormField, **kwargs)
Mon approche est empruntée à ici . Mais au lieu de sous-classement Django.Forms.Form, j'utilise un mixin. De cette façon, je peux l'utiliser avec les deux à utiliser, ajoutez simplement le mixin à votre formulaire p> formulaire code> et modelform code>. La méthode définie ici remplace baseforme code> 's _clean_fields code> méthode. class MyModel(ValidateModelMixin, Model):
....
Meilleure réponse imho. Merci!
Seule chose manquant est super (validateemodelmixin, auto) .Clean () code> au cas où le modèle qu'il est appliqué a déjà une méthode propre.
Stripwhitpacemixin est maintenant problématique, car des versions plus récentes de Django ont modifié la mise en œuvre de la méthode code> code>, de sorte que cela manque de comportement dans la classe de base. Voir ma réponse ci-dessous qui n'aura pas ce problème.
Utilisez le mixin suivant:
class MyForm(StripWhitespaceMixin, Form):
pass
Si vous voulez dépouiller () chaque charfield de votre projet; Il peut être le plus simple de Mode de nettoyage par défaut de Charfield. dans: Monkey_patch / __ init __. py code> p>
Depuis Django 1.9, vous pouvez utiliser Strip argument de mots clés dans le champ de votre formulaire Définition:
bande¶ Nouveau à Django 1.9. P>
class MyForm(forms.Form): myfield = forms.CharField(min_length=42, strip=True)
Vous voudrez peut-être aussi envisager le plus simple
STANCHE CODE> une fonction plutôt que de jouer avec les regexesVous pouvez utiliser
data = data.strip () code> au lieu de cette première ligne (laid).@ Michael, Julio - Ah merci! Je pensais que Strip ne supprime que les espaces à la fin d'une chaîne ... de la question éditée en conséquence.
Il existe également une méthode courante pour votre deuxième ligne:
data = '' .join (data.split ()) code>Python Strip () Supprime les espaces de direction et de fuite @westerley