2009-09-10 4 views
0

Il y a plusieurs questions à propos de plus ou moins le même problème dans stackoverflow, mais aucun d'entre eux ne semble couvrir les problèmes que je peux prévoir. Étant donné que mes connaissances de django sont limitées, je risque de réagir de façon excessive ... alorsPlusieurs formulaires django publiés à partir de la même page, en ligne et en ajoutant/supprimant ces inlines

Ce que je veux accomplir, avec django, est d'éditer 2 modèles, List et ListItem dans la même vue. Liste comme forme commune et listitem comme inlineformset. Créer ces deux formes n'est pas un problème. Les transmettre dans une vue> template n'est pas un problème non plus.

Ce que je suis inquiet est,

1) Comment les envoyer à même adresse et gérer cette demande de poste.

2) Comment configurer l'ajout/la suppression des ListItems en ligne de ce formset avec javascript. 2.1) si j'envoie une requête ajax à une adresse pour supprimer l'objet ListItem et ensuite utiliser javascript pour supprimer cette partie du formulaire. Comment la partie de vue django va-t-elle savoir, quel objet supprimer de la base de données? Ai-je besoin de passer l'ID de l'objet au modèle, pour que je puisse le renvoyer à l'affichage avec ajax? 2.2) Si tout le jeu de formulaires ListItem inline modifié est posté après avoir supprimé/ajouté des lignes, alors cela ne causera pas de problèmes, car le dictionnaire des objets qui a été utilisé initialement a été modifié entre les deux?

3) d'autres pièges que quelqu'un pourrait voir?

Btw je ne veux pas d'exemples de code. Si vous le pouvez, expliquez simplement comment les choses fonctionnent et ce que je devrais faire et garder à l'esprit. Si vous connaissez des exemples à jour, alors je pourrais aussi utiliser des liens.

Modifier (et réponse à mes questions): Je l'ai essayé et voici ce que je trouve: 1) Il suffit de les pos ... en vue, vous pouvez le faire comme ceci:

form = ListForm(request.POST, instance=l) 
formset = ShoppingListFormSet(request.POST, instance=l) 

Et puis faites tout ce qui est nécessaire - très simple et facile.

2) Dupliquer une ligne/un formulaire existant ou en supprimer un. Tout ce que vous devez garder à l'esprit, c'est que les noms des éléments sont corrects et que tout ce que formset charge avec {{form.management_form}} contient des informations à jour et correctes sur le nombre de formulaires. Tous les noms de champs doivent également être à jour. Si vous supprimez le formulaire entre les formulaires 1 et 3, les numéros de formulaire 3 doivent être remplacés par 2 et ainsi de suite.

2.1) id élément peut être extrait de {{}} form.initial.id puis utilisé sous forme

2.2) Non si les informations form.management_form est correct et si les noms de champs sont à jour (voir 2.)

3) Il suffit de créer des vues, de sorte que votre site ne sera pas ruiné par la demande de faux cross site (voir http://docs.djangoproject.com/en/dev/ref/contrib/csrf/)

Alan.

+0

Je vous suggère de rechercher REST http://en.wikipedia.org/wiki/Representational_State_Transfer. – geowa4

+0

J'ai parcouru ce texte et je dois admettre que je ne comprends pas comment cela répondrait à ma question. Peut-être que je ne suis pas intéressé par la programmation et je ne vise pas à devenir un programmeur. Je veux juste apprendre assez de python/django pour atteindre mes objectifs actuels. Il pourrait y avoir quelque chose d'utile pour moi dans ce post, mais maintenant je ne comprends pas ce que vous pensiez que je devais apprendre à partir de là? –

Répondre

1

La façon dont vous décrivez le faire est bien. En fait, je viens de poster une réponse similaire à une autre question de Django que vous pouvez voir ici - Django add/remove form without multiple submit La différence est bien sûr qu'il n'y a pas de javascript pour faire la modification AJAX et HTML côté client.

L'essentiel de REST comme mentionné ci-dessus (plus simplifié, je sais) est que tout est accessible par une URL. La façon dont "Django sait quel enregistrement à supprimer" est que pour chaque URL, une vue donnée y est mappée. C'est la vue qui reçoit l'ID d'enregistrement et qui sait ensuite laquelle supprimer.

Si vous ne l'avez pas déjà commencé à jouer avec AJAX, je recommande la recherche dans Jquery car il fournit des très facile à utiliser des emballages autour des objets de requête XML intégrés dans les navigateurs. Au fait, juste une recommandation car il semble que vous êtes nouveau à ceci - Tout fonctionne sans AUCUN ajax d'abord (même si les actions se traduisent par un écran blanc ou une mauvaise interface), puis ajoutez ajax second. Il est facile de déboguer quand vous n'êtes pas en train de faire des ajouts avec AJAX, et ensuite d'ajouter AJAX après que vous sachiez que tout fonctionne du côté serveur.

+0

Merci d'expliquer REST. J'avais pensé à la manipulation de l'élimination des éléments formset comme vous l'avez expliqué dans votre autre réponse, mais je n'ai pas mis cela en relation avec REST. Suggérer que je le fais sans ajax d'abord est également très sensible et c'est exactement la manière que je le ferai. Merci! J'ai déjà joué avec des appels ajax et j'ai trouvé que jquery travaillait incroyablement bien avec django jusqu'à maintenant. Mais tout cela ne répond toujours pas à mes préoccupations les plus sérieuses - comment gérer le formulaire d'inscription et inline formset sur la même URL et ce qui se passe .... –

+0

... lorsque ce formset charge 3 éléments dans le template. Si j'utilise un appel non ajax pour supprimer un de ces fichiers, alors je vais probablement le faire comme ceci, faire une demande sur url, qui contient toutes les informations nécessaires pour comprendre, que je veux supprimer un objet ListItem, il le supprime et m'envoie retour à la vue précédente/url. Cela crée un jeu de requête mis à jour pour ce jeu de formulaires en ligne. Mais, comme je le comprends, l'appel ajax supprime et js supprime l'objet du template, mais le queryset n'est pas mis à jour. Qu'est-ce qui se passe alors? Suis-je compliquer les choses et django «s'en occupe»? –

+0

Ok, je suis allé de l'avant et juste testé comment poster des formulaires multiples à la même adresse fonctionne et cela fonctionne tout comme l'affichage de formulaire unique. Qui aurait pensé que c'est si facile: P. Maintenant, ajouter et supprimer des lignes reste à tester. –

Questions connexes