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 ainsi. 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 dans 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 ou d'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?
Vous devez vous connecter pour publier un commentaire.
Ce n'est vraiment pas trop difficile à mettre en œuvre avec ModelForms. Donc disons que vous avez des Formulaires A, B et C. Vous avez l'impression de chacune des formes et de la page et maintenant vous avez besoin pour gérer l'après.
Ici sont les documents pour la validation personnalisée.
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 à une seule
<form>
, à l'aide deprefix
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és à 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é.
J'ai très récemment eu le problème et trouvé comment faire.
En supposant que vous avez trois classes de Primaire, B, C, et B,C ont une clé étrangère à la primaire
Cette méthode devrait vous permettre de faire ce que la validation dont vous avez besoin, ainsi que de générer tous les trois objets sur la même page. J'ai aussi utilisé du javascript et des champs cachés pour permettre la génération de plusieurs B,C des objets sur la même page.
La MultiModelForm de
django-betterforms
est une pratique wrapper pour faire ce qui est décrit dans Gnudiff réponse. Elle enveloppe régulièreModelForm
s dans une seule classe, qui est transparente (au moins pour une utilisation de base) sont utilisés comme un seul formulaire. J'ai copié un exemple de leurs docs ci-dessous.django-betterforms
et ses MultiModelForm de classe avant de venir à travers votre réponse. Leur solution est bien réel, mais il semble qu'il n'a pas été mis à jour en temps. Êtes-vous toujours à l'aide de cette @jozxyqk? Pas de problèmes?J'ai actuellement une solution fonctionnelle (elle passe mes tests unitaires). C'est une bonne solution à mon avis, quand vous voulez seulement ajouter un nombre limité de domaines à partir d'autres modèles.
Suis-je manqué quelque chose ?
"Je veux cacher certains champs et faire un peu de complexes de validation."
Je commence avec l'intégré dans l'interface d'administration.
Construire la ModelForm pour afficher les champs souhaités.
É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.
Alors 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.
Alors 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.
Selon la documentation de Django, en ligne jeux de formulaires sont à cet effet:
"Inline formsets est une petite couche d'abstraction sur le modèle formsets. Ces simplifier le cas de travail avec des objets liés par l'intermédiaire d'une clé étrangère".
Voir https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets