8
votes

Où nettoyer les espaces supplémentaires des entrées de champ de formulaire?

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 :


6
votes

3 commentaires

Vous pouvez utiliser data = data.strip () 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



0
votes

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 Clean () , vous supprimez ces espaces sures.

citant la documentation:

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).

plus à propos de ce sujet: https: // DOCS .djangoproject.com / fr / 1.3 / Ref / Formulaires / champs / # Création de champs personnalisés


1 commentaires

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é?



0
votes

Un moyen de faire cela consiste à spécifier un widget de formulaire personnalisé que les bandes blanchies: xxx

puis pour l'utiliser dans votre modelForm: xxx < p> Cependant, le meilleur endroit pour le faire est à votre vue après le formulaire a été validé; Avant de faire des insertions dans la DB ou une autre manipulation de données si vous utilisez modelform s.

Vous pouvez toujours créer votre propre non- modelform formulaires et contrôler tous les aspects du champ et de la validation de cette façon.

modelform S ajoute des vérifications pour les valeurs qui violeraient les contraintes de la DB; Donc, si le champ peut accepter 'hello' comme entrée valide, is_valid () 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").


0 commentaires

9
votes

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)


0 commentaires

10
votes

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 formulaire code> et modelform code>. La méthode définie ici remplace baseforme code> 's _clean_fields code> méthode. xxx pré>

à utiliser, ajoutez simplement le mixin à votre formulaire p>

class MyModel(ValidateModelMixin, Model):
    ....


3 commentaires

Meilleure réponse imho. Merci!


Seule chose manquant est super (validateemodelmixin, auto) .Clean () 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 , 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.



4
votes

Utilisez le mixin suivant:

class MyForm(StripWhitespaceMixin, Form):
    pass


0 commentaires

0
votes

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 xxx


0 commentaires

2
votes

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)


0 commentaires