2009-03-17 12 views
0

J'ai quelques éléments GUI complexes (comme un calendrier personnalisé avec beaucoup de jours qui peuvent être mis en évidence) qui apparaissent avec les champs de saisie de formulaire django standard. Je veux traiter les E/S de données à partir de ces formes complexes avec les formulaires Django. Auparavant, j'utiliserais les requêtes AJAX pour traiter ces éléments GUI personnalisés sur mon formulaire HTML après l'enregistrement ou le rendu du formulaire Django, mais cela entraîne une série de problèmes et un codage AJAX personnalisé. Quel est un bon moyen de gérer les widgets d'interactions complexes dans un formulaire Django?Comment traiter un élément d'interface graphique complexe dans un formulaire django?

Répondre

1

Je ne sais pas si je comprends parfaitement, mais vous pourriez avoir la valeur de votre interface utilisateur enregistrée dans un élément caché sur le formulaire via javascript. Cela peut être fait car ils sélectionnent les valeurs dans l'interface utilisateur ou quand ils soumettent le formulaire. pseudo-code en supposant JQuery à l'aide de soumettre() pour enregistrer avant la soumettre les données sont envoyées:

$('#myForm').submit(function(){ 
    // get the value of your UI 
    var calendarValue = calendarWidget.getValue() 

    // #calendarData is the hidden field 
    $('#calendarData').val(calendarValue) 
}) 

Cela nécessite évidemment JS, mais le fait en utilisant votre élément d'interface utilisateur.

1

Votre question est très vague, donc je vous suggère de lire la documentation de Django sur writing a custom field et j'espère que cela vous aidera à démarrer. Vous pourriez également vouloir étudier l'écriture d'un widget personnalisé. Malheureusement, la documentation manque un peu là-dessus, mais une recherche sur Google fait apparaître plusieurs articles de blog utiles, notamment this one.

1

Vous avez trois options selon la façon dont vous produisez votre sous-classe Django Form à la page HTML.

La première n'implique aucune forme. Toute entrée de formulaire html se retrouvera dans request.POST, vous pouvez donc y accéder. Bien sûr, ils ne seront pas liés à votre sous-classe Form, donc vous devrez injecter manuellement la valeur en utilisant un constructeur de formulaire personnalisé, ou en définissant une propriété sur votre objet Form après l'avoir instanciée avec request.POST. C'est probablement l'option la moins souhaitable, mais je le mentionne dans le cas où votre cas d'utilisation ne supporte vraiment rien d'autre. La seconde est une option si vous produisez manuellement les champs de formulaire dans votre code HTML (par exemple: en utilisant {{ myform.field }} plutôt que seulement {{ myform }}.) Dans ce cas, créez une variable cachée pour contenir la valeur de votre outil d'interface graphique de calendrier (les chances sont, Ajoutez ce champ caché, avec le bon nom et le bon ID, à la sous-classe Form elle-même, en vérifiant qu'il y a un widget de forme django caché.Si nécessaire, utilisez javascript comme Rob suggère de remplir le caché Lorsque le formulaire est posté, il sera normalement lié à votre sous-classe de formulaire parce que, cette fois, vous avez un champ dans votre sous-classe Form avec ce nom.La machine pour clean() fonctionnera comme d'habitude

, et le meilleur opti sur, est d'écrire un champ personnalisé django; Le message d'Andrew a le lien. Les champs Django ont la capacité de spécifier les exigences js et, de sorte que vous pouvez encapsuler automatiquement ces dépendances pour toute page utilisant votre widget de calendrier.

Questions connexes