7
votes

Modèles Django avec des relations OneSoOne?

Disons que j'utilise que j'utilise les auth.models.user plus Mes My Custom et adresse modèles qui ressemblent à ceci: < Pré> xxx

maintenant je souhaite créer un formulaire d'inscription. Je pourrais créer un modelform basé sur utilisateur mais qui n'inclut pas les champs du profil et adresse (qui sont requis). Alors, quelle est la meilleure façon de faire de la construction de ce formulaire? Devrais-je même utiliser modelform du tout?

En outre, comment utiliserais-je le même formulaire pour éditer l'objet complexe? Je pourrais facilement passer une instance de profil, qui contient des références à l'adresse et des objets de profil nécessaires, mais comment puis-je l'obtenir pour remplir les champs pour moi?


2 commentaires

@Mark Dans votre exemple vous avez référencé adresse avant de le créer. Vous aurez besoin de l'envelopper dans des guillemets pour faire cela ou déplacer profil ci-dessous adresse si vous souhaitez ne pas utiliser de guillemets.


@orokusaki: Je pense que j'ai collé ceux de deux endroits différents, ou j'aurais eu une erreur. Je ne savais pas que je pouvais simplement utiliser des citations. Merci.


3 Réponses :


3
votes

Vous devez aborder la manière recommandée officiellement d'étendre le modèle utilisateur d'abord, Comme on le voit dans les docs , que je crois, vient directement du blog personnel du chef de projet À propos du sujet . (L'article de blog actuel est plutôt vieux, maintenant)

Quant à votre problème réel avec les formulaires, consultez la propre réutilisable du chef de projet Django-profiles APP et voyez si le code résout votre problème. Spécifiquement Ces fonctions et Les vues dans lesquelles elles sont utilisées.

< Strong> édité pour ajouter:

Je l'ai examiné un peu (comme je devais le faire moi-même). Il semble que quelque chose comme ça serait donc suffisant: xxx

J'utilisais "..." pour snip sur le contenu du code ci-dessus. Je n'ai pas encore testé cela, mais de regarder à travers des exemples et la documentation sur les formulaires, je crois que cela soit correct.

NOTE I Mettez le FK du modèle d'adresse à la UserProfile et non l'inverse, comme dans votre question. Je crois que les farsets inline ont besoin de cela pour fonctionner correctement.

puis sur votre point de vue et de vos modèles, vous finirez par traiter les formations user, l'userprofileForme et l'adresse d'adressage séparément, mais ils peuvent tous être insérés dans la même forme.


7 commentaires

J'utilise déjà la manière officiellement recommandée d'étendre le modèle d'utilisateur. Cette application Django-profiles ne semble pas être utile non plus. C'est pour créer un profil après que l'objet utilisateur existe déjà, pas pour les créer simultanément avec le formulaire un .


EDIT: D'accord, je n'utilise pas la "voie recommandée" Verbatim. J'utilise OneToone plutôt que pour l'entreprise étudiante car cela a plus de sens pour moi, mais c'est le seul diff.


Je crois qu'utiliser fournedgey avec unique = true est recommandé pour plusieurs raisons, dont l'une est que ce ne serait qu'une seule requête, tandis que OneOneOnefield le ferait deux. Je ne peux pas dire avec certitude si les raisons que j'ai lues s'appliquent toujours à 1.1 ou 1.2.


Avoir le FK sur l'adresse défait complètement le but de l'objet Adresse. D'autres choses ont aussi des adresses. Peu importe, vous pouvez échanger la commande dans le inlineformset_factory mais cela ne résout pas le problème, car j'ai plusieurs FKS, pas seulement un. Et je n'ai toujours aucune idée de la façon dont ce format est censé rendre.


Oh, et en outre, cela ressemble à des fichifications que vous êtes autorisé à laisser les données de cette forme particulièrement vierge, ce qui n'est pas ce que je veux (c'est nécessaire).


Les fichifications ont toujours un is_valid () méthode pour que je n'ai aucune idée de ce dont vous parlez. Je n'avais pas l'intention de fournir un exemple complet rempli de formulaires d'exemples de validation.


Oui ... ils ont is_valid () mais à partir de ma compréhension, si Tous Les champs de formulaire sont laissés en blanc, il ne sauvegardera pas ce modèle, car les consignets sont faits pour Saisie de plusieurs objets, pas pour les modèles de mixage et de correspondance.



1
votes

Je pense que vous recherchez Inline Formsets avec des formulaires de modèle. Cela vous aide à faire face à de multiples formulaires sur une page et à prendre soin des relations clés étrangères.

mise à jour:

Peut-être que cette question vous aide aussi à vous aussi: Django: plusieurs modèles d'une modèle utilisant des formulaires


5 commentaires

Cela semble avoir un potentiel, mais comment puis-je faire un formé en ligne Swith deux ou plus étrangers?


Si vous parlez de deux ou plusieurs clés étrangères pour différents modèles peu importe car vous n'avez que spécifier le modèle. S'il s'agit de deux touches étrangères ou plus du même modèle que vous utilisez fk_name pour spécifier quel champ. Quoi qu'il en soit, j'ai mis à jour ma propre réponse avec un exemple (hier), et vous devriez le vérifier.


Hein? InlineFormeSe_Factory (Auteur, Book) . book a un auteur FK AO . Mais je ne sais pas ce que prend cette fonction la fonction, puis-je spécifier plus de fks là-bas? Comme inlineformset_factory (utilisateur, adresse, profil) où le profil a FKS à l'utilisateur et à l'adresse? Et puis je peux rendre ce format et montrera les formulaires pour tous ceux-ci, et les sauvegardera tout de profiter?


"Hein?" a raison .. Je n'ai aucune idée de ce dont vous parlez. Vous démarrez un dans votre modèle, alors vous entrez (par exemple) (par exemple) user_form , Profile_form et de toutes les constructives d'inline que vous pourriez avoir, Et puis vous mettez dans une étiquette ` '!


Le point était de combiner les utilisateurs, les adresses et les profils dans une forme. Si je vais les faire séparément, alors je ne vois pas quel avantage ces "formes d'inine" me donnent.



8
votes

Qu'en a-t-il d'utiliser 3 Modelform . Un pour adresse , un pour utilisateur , et un pour profil mais avec: xxx

alors, processus Ces 3 formes séparément dans votre point de vue. Spécifiquement, pour le profileForm Utiliser Enregistrer avec commit = FAUX pour mettre à jour utilisateur et adresse Field sur l'instance: xxx

n'hésitez pas à utiliser les transactions ici pour assurer des lignes sûres uniquement lorsque les 3 formes sont valides.


4 commentaires

On dirait que c'est la voie à suivre. Je ne suis pas content de ça, mais c'est la seule chose qui fonctionne. J'aurais aimé quelque chose de "DeepModelform" où les étrangers / oneoones sont convertis à leur propre forme, plutôt que d'un avec des objets existants.


@ Clément La nouvelle façon correcte de cela (1.2 ou dev 1.2) est dans propre () au lieu de remplacer sauvegarder () .


@orokusaki: Je ne pense pas qu'il suggère que je suggère de remplacer la méthode de sauvegarde, juste pour l'appeler avec commit = false . @CEMENT: la façon dont je l'ai fait était si.is_valid () et b.is_vald () et c ... , donc j'espère qu'il n'y aura jamais de cas où ils ne sont pas tous valables avant de commencer à les sauver.


bonne idée! J'allais descendre le trou de lapin de personnaliser les constructeurs en ligne, mais cela ressemble à une option de beaucoup de Néater.