2010-10-15 3 views
1

Ceci est en fait un suivi d'un previous question.Comment enregistrer des données de formulaire sur différents modèles avec une relation un-à-un dans Django

données de profil d'un utilisateur est réparti sur plusieurs modèles différents, comme ceci:

# Simplified versions, actual classes contain many more fields. 

class Profile(models.Model): # returned by Django's User.get_profile() 
    user = models.OneToOneField(User) 

    home_address = models.OneToOneField(Address) 
    work_address = models.OneToOneField(Address) 

    language = models.CharField(max_length=20) 

class Address(models.Model): 
    street = models.CharField(max_length=100) 
    city = models.CharField(max_length=100) 

... et Django User, bien sûr.

Je veux que l'utilisateur d'entrer toutes ses données de profil dans une vue, en particulier ces informations:

  • nom d'utilisateur (User)
  • email (utilisateur)
  • langue (Profil)
  • home_address.street (Adresse)
  • home_address.city (Adresse)
  • work_address.street (Adresse)
  • work_address.city (Adresse)

Alors, quelle serait la façon la plus simple/Django

  1. construire une telle forme?
  2. afficher le formulaire dans le modèle?
  3. gérer les données de formulaire entrantes, les diviser en différents modèles et créer les objets nécessaires (par exemple, un User, un Profile et 2 Address objets)?
+0

Réponse mise à jour ... – FallenAngel

Répondre

0

moyen le plus pratique est, je suppose, en utilisant ModelForm et formsets ...

Vous pouvez utiliser le formulaire de modèle pour créer des formes à partir d'un modèle. Docs here .... Vous pouvez utiliser formset en ligne pour créer des formulaires et enregistrer des données facilement ... Doc here ...

Mais, bien sûr, les modèles liés doivent avoir foreignkey soit utilisateur ou un profil. La structure de votre modèle peut ne pas convenir, car autant que je sache, le modèle inline doit avoir une clé étrangère à l'autre, donc à ce stade, votre clé étrangère à Profile doit être dans le modèle Address ... Mais comme je l'ai dit, je suis pas sure.you peut essayer ...

Puisque vous avez des relations appropriées ForeignKey, vous pouvez utiliser formsets en ligne avec ModelForm pour créer un formulaire à partir de nombreux modèles ...

EDIT:

Pour autant que je comprenne, vous pouvez soit utiliser modelforms (sans formsets) et facilement cerat votre formulaire dans le modèle. Mais dans votre fonction d'affichage qui traitera les données affichées, vous devez définir manuellement les connexions un à un étrangères. Comme:

home = Address.objects.create(...) 
work = Address.objects.create(...) 
Profile.objects.create(home_address=home, work_address=work,...) 

Ou vous pouvez modifier vos modèles:

class Profile(models.Model): # returned by Django's User.get_profile() 
    user = models.OneToOneField(User) 
    language = models.CharField(max_length=20) 

class Address(models.Model): 
    profile = models.ForeignKey(Profile) 
    street = models.CharField(max_length=100) 
    city = models.CharField(max_length=100) 
+0

J'ai regardé dans des formsets et des formsets en ligne, et ils semblent convenir aux cas où vous avez de nombreux objets d'un genre, ou un objet parent et plusieurs objets enfants d'un genre, respectivement. Donc non, je ne pense pas qu'ils aident ici car la hiérarchie des modèles est plus compliquée. – anttikoo

1

Je pense que vous êtes au point où modelforms et formsets nécessiteront plus de travail à personnaliser que vous économiserez en les utilisant.Donc, j'utiliserais un formulaire standard (non-modèle), définirais les types de champs manuellement, et les enregistrerais explicitement dans les modèles pertinents - soit dans la vue, soit en définissant votre propre méthode save() sur le formulaire et en l'appelant .

Questions connexes