111 votes

Django : plusieurs modèles dans un modèle à l’aide de formulaires

Je suis en train de construire un ticket de support de suivi de l'app et avoir quelques modèles que j'aimerais créer une page. Les billets d'appartenir à un Client via une ForeignKey. Les Notes appartiennent à des Billets par l'intermédiaire d'une ForeignKey. J'aimerais avoir l'option de sélection d'un Client (c'est un tout autre projet) OU la création d'un nouveau Client, puis la création d'un Ticket, et enfin la création d'une Note attribuée à un nouveau billet.

Depuis que je suis assez nouveau à Django, j'ai tendance à travailler de manière itérative, en essayant de nouvelles fonctionnalités à chaque fois. J'ai joué avec ModelForms mais je veux cacher certains champs et faire un peu de complexes de validation. Il semble que le niveau de contrôle, je suis à la recherche pour les besoin de formsets ou tout faire à la main, avec une fastidieuse, codée à la main de modèle de page, que j'essaie d'éviter.

Est-il une caractéristique belle je suis absent? faut-il une bonne référence / exemple pour l'utilisation de formsets? J'ai passé un week-end entier sur l'API docs pour eux et je suis toujours paumé. Est-ce un problème de conception si je suis en panne et de la main-code tout?

Merci à l'avance!

83voto

Jason Christa Points 2739

Ce n’est vraiment pas trop difficile à mettre en place avec ModelForms. Permet donc dire que vous avez des formes A, B et C. Vous imprimez chacune des formes et la page et maintenant vous devez gérer le poste.

Ici sont les docs pour une validation personnalisée.

64voto

Gnudiff Points 2157

J'ai été dans la même situation un jour plus tôt, et voici mes 2 cents:

1) j'ai trouvé sans doute le plus court et le plus concis démonstration de plusieurs d'entrée du modèle de formulaire unique ici: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .

En un mot: Faire un formulaire pour chaque modèle, les soumettre à la fois à un modèle dans un seul <form>, à l'aide de prefix keyarg et ont la vue sur la poignée de la validation. Si il y a dépendance, assurez-vous d'enregistrer le "parent" modèle avant de personne à charge, et l'utilisation d'un parent ID de clé étrangère avant la validation d'économiser de l'enfant modèle. Le lien de la démo.

2) Peut-être formsets peut être battu en faire, mais autant que j'ai fouillé dans, formsets sont principalement pour la saisie multiples du même modèle, qui peut éventuellement être lié à un autre modèle/modèles par des clés étrangères. Cependant, il semble y avoir pas de choix par défaut pour la saisie de plus d'un modèle de données et ce n'est pas ce formset semble être destiné.

5voto

Paul Bormans Points 321

J’ai actuellement une solution fonctionnelle (elle passe mes tests unitaires). C’est une bonne solution à mon avis, lorsque vous souhaitez ajouter un nombre limité de domaines des autres modèles.

Ai-je raté quelque chose ici ?

3voto

S.Lott Points 207588

"Je veux cacher certains champs et faire un peu de complexes de validation."

Je commence avec l'intégré dans l'interface d'administration.

  1. Construire la ModelForm pour afficher les champs souhaités.

  2. Étendre le Formulaire avec les règles de validation du formulaire. Habituellement, c'est un clean méthode.

    Être sûr de cette partie fonctionne raisonnablement bien.

Une fois cela fait, vous pouvez éloigner de la intégré dans l'interface d'administration.

Ensuite, vous pouvez tromper avec plusieurs, en partie liés à des formes sur une seule page web. C'est un tas de modèle de choses à présenter toutes les formes sur une seule page.

Ensuite, vous devez écrire la fonction de visualisation de lire et validé les différentes forme des choses et ne les divers objet enregistre().

"Est-ce un problème de conception si je suis en panne et de la main-code tout?" Non, c'est juste beaucoup de temps pour pas beaucoup de bénéfices.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X