7
votes

Effacement des champs de formulaire Django sur une erreur de validation de formulaire?

J'ai une forme Django qui permet à un utilisateur de changer de mot de passe. Je trouve que cela confondre sur une erreur de formulaire pour les champs d'avoir les données * 'ED OUT sur eux.

J'ai essayé plusieurs méthodes d'élimination de formes.data, mais je continue à obtenir un cette instance QueryDict est immuable message d'exception.

Y a-t-il une bonne façon de nettoyer les champs de formulaire individuels ou l'ensemble de données de formulaire à partir de propre () ?


1 commentaires

Vous pouvez utiliser JavaScript, qui fonctionnerait dans 95% des cas selon: w3schools.com/browersers /browsers_stats.asp ; Exemple: LearningJQuery.com/2007/08/clearing-Form-Data


7 Réponses :


0
votes

Si vous avez besoin de validation supplémentaire en utilisant plusieurs champs d'un formulaire, remplacez la méthode .Clean (). Mais si c'est juste pour un champ, vous pouvez créer une méthode Clean_Field_Name ().

http: //docs.djangoproject. COM / EN / 1.1 / REF / FORMES / VALIDATION / # REF-FORMULAIRE-VALIDATION


3 commentaires

Igor, je sais comment valider le formulaire. Le problème est que la validation échoue, je souhaite que le champ de formulaire est retourné vide, non pas avec les données fournies par l'utilisateur.


Igor est sur la bonne voie, cependant, Chrisw. IMO, vous devez utiliser la méthode net () pour valider les deux mots de passe - et s'ils ne sont pas corrects, effacez les champs Self.Data <à ce point>, avant de soulever une erreur de validation.


Quelqu'un pourrait-il élaborer un peu plus. Quand j'essaye auto.data ['champ'] = Aucun juste avant de soulever la validationError rien ne se passe, et l'erreur de validation n'est même pas élevée.



-2
votes

Je suppose que vous devez utiliser JavaScript pour masquer ou supprimer le texte du conteneur.


1 commentaires

Il faut certainement être un moyen de faire ce serveur ... Selon le côté du client, JavaScript est un moyen assez désordonné d'accomplir cela.



2
votes

Quelqu'un m'a montré comment faire cela. Cette méthode fonctionne pour moi: xxx


3 commentaires

Cela fonctionne, mais ce n'est pas très propre puisque vous le faites au niveau des vues. IMO, vous devez sous-classer le formulaire de connexion par défaut et remplacer la méthode propre () comme suggérée d'Igor. C'est-à-dire de la première validation, ils sont corrects; Énumérez les champs de Self.Data pertinents et soulevez enfin une validationError.


Toute chance que vous puissiez élaborer? Je reçois toujours les erreurs immuables requêtes.


post_vars.update (demande.post) est une manière moins propre de dicter (demande.post). Dans les deux cas, les valeurs qui sont soumises par la forme que vous ne remplacez pas avec form.data finissent par se présenter dans le formulaire rendu comme U '' (Je ne sais pas pourquoi cela se produit toutefois). Utilisation de demande.post.copy () Comme suggéré par @ian a travaillé comme un charme.



-1
votes

Vous ne pouvez pas simplement supprimer les données de mot de passe du formulaire CLEEED_DATA pendant la validation?

voir Les documents Django pour la validation personnalisée (en particulier le deuxième bloc de code).


0 commentaires

7
votes

En ce qui concerne l'erreur de requête immuable, votre problème est presque certainement que vous avez créé votre instance de formulaire comme ceci: xxx

ceci signifie que form.data est le requête réelle créée à partir des projections. Étant donné que la demande elle-même est immuable, vous obtenez une erreur lorsque vous essayez de changer quoi que ce soit. Dans ce cas, dire xxx

est exactement la même chose que xxx

pour obtenir une forme que vous pouvez modifier , vous voulez le construire comme ceci: xxx


1 commentaires

Notez que pour un champ de fichier ou un champ d'image dans le formulaire, vous devrez définir Form.files et non form.Data de la même manière.



0
votes

Je viens de créer le formulaire à nouveau.

Just Essayez: P>

form = AwesomeForm()


0 commentaires

0
votes

Django a un widget qui fait ça: https://docs.djangoproject.com/fr/1.8/ref/ Formulaires / Widgets / # PasswordImput

MAINTENANT Si vous ne travaillez pas avec des mots de passe, vous pouvez faire quelque chose comme ceci: P>

class NonceInput(Input):
    """
    Hidden Input that resets its value after invalid data is entered
    """
    input_type = 'hidden'
    is_hidden = True

    def render(self, name, value, attrs=None):
        return super(NonceInput, self).render(name, None, attrs)


0 commentaires