2014-05-16 5 views
0

Dans mon application, j'ai des utilisateurs, et chaque utilisateur peut parler plusieurs langues, chacune à un niveau différent. Voilà donc comment je l'ai écrit mes modèles:Django: Écrire un modèle Créer/Mettre à jour pour un modèle avec une relation ManyToMany-Through

class Language(models.Model): 
    name = models.CharField(max_length=255 

class UserProfile(AbstractUser): 
    languages = models.ManyToManyField(Language, through='SpeakingLevel') 

class SpeakingLevel(models.Model): 
    user = models.ForeignKey(UserProfile) 
    language = models.ForeignKey(Language) 

    LEVEL_OK = 1 
    LEVEL_BAD = 2 
    LEVEL_CHOICES = (
     (1, "Ok"), 
     (2, "Bad") 
    ) 
    level = models.IntegerField(null=True, 
           choices=LEVEL_CHOICES) 

Mon doute est comment dois-je écrire les modèles pour la création/mise à jour UserProfile. Je n'ai aucune idée. L'idée est d'avoir quelque chose comme ça (c'est une capture d'écran de okcupid.com):

enter image description here

Bien sûr, je peux le faire manuellement avec beaucoup de javascript, et peut-être un moteur de template javascript pour ajouter de nouvelles langues à la liste, mais il semble fou de gérer une relation, je suis sûr que je manque une fonctionnalité de Django cool pour gérer cela.

Quelle est la bonne façon de procéder?

+1

Fondamentalement, vous devez créer un formset en ligne pour votre modèle 'SpeakingLevel' et l'attacher à votre formulaire' UserProfile'. Voir [les docs] (https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets). Je pense que cela vous donnera ce que vous cherchez. –

+0

Le formset en ligne plus [django-formset-js] (https://pypi.python.org/pypi/django-formset-js/) a fait l'affaire. Je vous remercie! –

Répondre

1

Cette solution s'applique lorsque vous créez le profil utilisateur dans le panneau d'administration django. Django a quelque chose comme inlines, mais le problème avec ceci est que la section avec les langues ne sera pas visible pendant que vous créez UserProfile, après que vous l'avez créé et que vous passiez à la vue d'édition, vous verrez en ligne avec les langues.

ligne a déjà tout nécessaire code javascript :)

PS. Si vous trouvez une autre solution «cool» faites-moi savoir dans le commentaire, je suis curieux :)

+0

J'ai finalement utilisé un formset en ligne et [django-formset-js] (https://pypi.python.org/pypi/django-formset-js/), un plugin jquery cool pour gérer les jeux de django. –

Questions connexes