J'utilise WTForms avec Flask via l'extension Flask.WTF. Cependant, cette question n'est pas spécifique à Flask. WTForms comprend un FieldList
field for lists of fields. J'aimerais l'utiliser pour créer un formulaire dans lequel les utilisateurs peuvent ajouter ou supprimer des éléments. Cela nécessitera une sorte de framework Ajax pour ajouter dynamiquement des widgets, mais la documentation de WTForms n'en fait aucune mention. Les autres cadres comme Deform come with Ajax support. Existe-t-il un cadre similaire disponible pour WTForms?Utilisation de WTForms FieldList
Répondre
J'ai utilisé quelque chose comme ça avec mon FieldList/FormField pour permettre l'ajout d'entrées:
$(document).ready(function() {
$('#add_another_button').click(function() {
clone_field_list('fieldset:last');
});
});
function clone_field_list(selector) {
var new_element = $(selector).clone(true);
var elem_id = new_element.find(':input')[0].id;
var elem_num = parseInt(elem_id.replace(/.*-(\d{1,4})-.*/m, '$1')) + 1;
new_element.find(':input').each(function() {
var id = $(this).attr('id').replace('-' + (elem_num - 1) + '-', '-' + elem_num + '-');
$(this).attr({'name': id, 'id': id}).val('').removeAttr('checked');
});
new_element.find('label').each(function() {
var new_for = $(this).attr('for').replace('-' + (elem_num - 1) + '-', '-' + elem_num + '-');
$(this).attr('for', new_for);
});
$(selector).after(new_element);
}
Supprimer des boutons serait beaucoup plus délicat.
(code la plupart du temps emprunté réponse à Dynamically adding a form to a Django formset with Ajax.)
De votre description, je ne vois pas pourquoi Ajax est particulièrement nécessaire, bien que vous ayez besoin de la logique JavaScript pour ajouter/supprimer des lignes. J'ai implémenté cette fonctionnalité en utilisant WTForms, mais sans support particulier de WTForms lui-même; Vous devez juste vous assurer que lorsque vous créez des widgets côté client, vous le faites en utilisant des noms de champs que WTForms analysera correctement dans la liste côté serveur. Vous pouvez cloner une ligne existante en utilisant le JavaScript côté client pour ajouter des lignes, de sorte que le rendu d'une ligne soit cohérent entre les lignes générées côté serveur et les lignes créées côté client.
Err, oui, cela n'a pas besoin d'Ajax, juste un modèle à reproduire. Avez-vous du code que vous pouvez partager? –
- 1. WTForms FieldList - obtention de données non triées
- 2. Comment itérer WTForms FieldList avec Jinja2
- 3. Quelque chose ne va pas avec wtforms FieldList && validation
- 4. wtforms ReferencePropertyField ensemble sélectionné
- 5. WTForms obtenir les erreurs
- 6. Jinja2 et WTForms imbrication
- 7. WTForms ... html, autofocus?
- 8. wtforms-recaptcha quelqu'un?
- 9. Tri WTForms form.errors dict
- 10. Flask WTForms ne montrant pas les données
- 11. Bootstrap Multiselect Intégration avec WTForms
- 12. WTforms: Erreur "champ non présent"
- 13. taille de forme par défaut pour WTForms
- 14. Message HTTP avec GAE (et WTForms)
- 15. Devrais-je utiliser wtforms avec Pylons?
- 16. Administrateur CRUD générique pour Flask, avec WTForms?
- 17. Comment remplacer pre_validate et post_validate dans wtforms?
- 18. WTForms ne rendra pas les champs
- 19. WTForms - chaîne multi-valeur à SelectMultipleField
- 20. Application Flask utilisant WTForms avec SelectMultipleField
- 21. WTForms la création d'un widget personnalisé
- 22. Comment les filtres fonctionnent-ils dans wtforms?
- 23. Télécharger le fichier en ajax avec wtforms
- 24. Passer des données de session de Flask à WTForms
- 25. AngularJS de liaison ng modèle à wtforms CSRF domaine
- 26. Wtforms: l'ajout de champs dynamiques avec l'héritage multiple
- 27. Comment ajouter un nouveau FormField wtforms avec les données initiales par défaut?
- 28. WTForms validators.optional: continuer la validation des champs vides?
- 29. WTForms: Le passage des arguments supplémentaires en ecriture validation personnalisée
- 30. Flask-WTForms: comment vérifier si un champ est requis?
Désolé, je n'ai pas de code que je peux facilement partager - le JavaScript que je fait partie d'un cadre personnalisé basé sur YUI 2. Cependant, le noyau opération cloné la dernière ligne du conteneur contenant les lignes, en utilisant 'cloneNode', puis renommé récursivement les éléments enfants dont les noms correspondaient à une regex appropriée. –