7
votes

Les champs de formulaire ajoutés dynamiquement sont supprimés dans form.cleaned_data

Je mettais du JavaScript côté client dans mon modèle qui permet à un utilisateur d'ajouter de manière dynamique des champs à un formulaire. Mon problème est que ces champs sont nettoyés dans form.cleaned_data , donc je ne peux donc pas y accéder de cette façon.

Tous les champs sont accessibles dans Demande.post , afin que je puisse simplement résoudre ce problème avec cela, mais je veux faire cela «de droite» et je pense que la solution se trouve quelque part dans Utiliser Django Forms plutôt que de lire la demande directement.

J'ai essayé de remplacer form.clean () , mais il semble que les données sont déjà passées au moment où elle y arrive.

Autres détails: Je nomme ces champs FieldName_x , où x est un nombre. Dans demande.post , demande.post ['champ de champ'] est une liste d'une liste de toutes les valeurs, mais form.cleaned_data ne contient que le Dernière valeur de chaque liste.


0 commentaires

3 Réponses :


2
votes

Savez-vous quel type ces champs vont être préalablement? Vont-ils simplement être des champs de texte simples? J'ai fait quelque chose de similaire à cela, créant des formes dynamiques.

<input type='text' name='fieldname_1' value='value_for_field_1' /> 


0 commentaires

0
votes

Je le fais dans le projet que je travaille actuellement. Vous voudrez avoir un coup d'oeil à des constructeurs automatiques. Mais soyez averti, ce n'est pas joli. Vous devez modifier ce champ masqué stupide qui stocke au nombre de formulaires, et vous devez renommer les entrées correctement .. qui implique beaucoup d'analyse de chaîne inutile. S'ils avaient utilisé des tableaux, comme PHP, il n'y aurait pas de problème, mais ils ne seraient pas plié pour rendre ma vie misérable ... Rambles off

EDIT: http://docs.djangoproject.com/fr/dev/ Thèmes / Formulaires / Formulaires / # Vide-forme Ils fournissent ce qui rend votre vie 5% moins douloureuse ... vous pouvez simplement trouver une trouvaille et remplacer sur préfixe avec le nombre approprié. . Mais je pense que j'ai eu un problème dans lequel la forme vide ne contient pas les valeurs par défaut appropriées si vous initialisez le formulaire avec des données postales, je devais donc créer une deuxième instance sans poster de données sur une forme empty_flage en réalité, ce qui est juste retardé. .


4 commentaires

Ralph, je suggérerais que tu es passé à ce sujet. Tirer parti du système de python et de Django de faire des choses. Créer de manière dynamique des modèles et des formulaires si nécessaire. Voir ma réponse.


Votre "python d'effet de levier" "et Django" sont en attente. Vous avez certainement profité de la dynamique de Python, mais je l'ai fait la voie Django. Ils mettent spécifiquement vide_form dans le présent afin de pouvoir l'utiliser dans vos scripts JS et d'ajouter des formulaires / champs à un formulaire de formulaire, c'est ainsi que c'est comme ça que je l'ai fait. Pas besoin de pirater dans des champs supplémentaires.


J'interprète la description de formulaire vide comme permettant à JavaScript d'ajouter des formulaires supplémentaires à un formulaire, pas de champs supplémentaires à un formulaire. Vous avez dit vous-même que la façon dont vous avez fait cela était douloureuse, impliquait beaucoup de traitement de cordes et tout simplement de la méchanceté. Ma solution est de 4 lignes de code et est extrêmement facile à entretenir.


@JOSH: Vous pouvez mettre un seul champ dans un format si vous le souhaitez. Quoi qu'il en soit, je vous donne un +1.



2
votes

Il est également possible de faire ce travail dans votre fichier de formulaire, voici une excellente démonstration de Jacob Kaplan-Mosse pour des formulaires dynamiques: http://jacobien.org/writing/dynamic-forming-generation/ qui s'applique assez bien pour ce problème.

Qu'est-ce que c'est fait, c'est ajouter une méthode à vous former classe Cela ajoutez les champs dynamiques supplémentaires, puis rapporte les informations du nettoyage afin que vous puissiez l'obtenir à votre vue. p> xxx pré>

et pour l'appeler à partir de la vue: p >

def doSomething(request, extra_fields):
    form = MyForm(request.POST or None, extra=extra_fields)
    if form.is_valid():
        for (question, answer) in form.extra_answers():
            save_answer(request, question, answer)
        return redirect("create_user_success")

return render_to_response("template/form.html", {'form': form})


0 commentaires