2011-09-01 9 views
2

Ce problème est similaire à ceux-ci a et b, mais peu différent. Je suis nouveau à django, alors s'il vous plaît ours avec moi. Voici mes modèlesDjango Intermediary modèle save() question

class Project(UniqueIdentifier): 
    status = models.CharField(max_length=2) 

class User(UniqueIdentifier): 
    first_name = models.CharField(max_length=50,blank=False,null=False) 
    last_name = models.CharField(max_length=50,blank=False,null=False) 
    email_address = models.EmailField(max_length=200) 
    user_state = models.BooleanField() 

    class Meta: 
     abstract = True 

class Employee(User): 
    experience = models.DecimalField(max_digits=4, decimal_places=2) 
    userType = models.CharField(max_length=2,choices=USER_TYPES) 

class Team(UniqueIdentifier): 
    role = models.CharField(max_length=2) 
    members = models.ManyToManyField(Employee, through="TeamMember") 
    belongsTo = models.ForeignKey(Project, related_name="team") 

class TeamMember(UniqueIdentifier): 
    team = models.ForeignKey(Team) 
    members = models.ForeignKey(Employee) 

et à mon avis générique classe

class ProjectView(UpdateView): 
    model = Project 
    fset = inlineformset_factory(Project,Team,form=TeamForm,can_delete=False,fk_name="belongsTo",extra=0) 
    def get_object(self, *args, **kwargs): 
     c = get_object_or_404(Project, unique_id = self.kwargs.get('cid')) 
     df = ProjectForm(instance=c) 
     ....... 
     return c 

    def get_context_data(self, *args, **kwargs): 
     context = super(ProjectUpdateView, self).get_context_data(*args, **kwargs) 
     .......... 
     return context 

    def form_valid(self,form,*args, **kwargs): 
     c = get_object_or_404(Project, unique_id = self.kwargs.get('cid')) 
     if self.request.method == "POST": 
      df = ProjectForm(self.request.POST, instance = c) 
      if df.is_valid(): 
       c = df.save() 
       fs = self.fset(self.request.POST,instance=c) 
       if fs.is_valid(): 
        k=fs.save() 

et je reçois cette erreur.

Cannot set values on a ManyToManyField which specifies an intermediary model. 

S'il vous plaît suggérer si quelqu'un a une solution alternative (je ne veux vraiment pas renverser la logique dans une forme séparée). Appréciez votre aide, merci!

** Mise à jour: Found soluton here. Voici ma solution,

Class ProjectView(CreateView): 
    ......... 
    def form_valid(): 
     ......... 
     if fs.is_valid(): 
        k=fs.save(commit=False) 
        for h in k: 
         h.save() 
        for x in range(0,len(k)): 
         for y in self.request.POST.getlist('team-'+str(x)+'-members'): 
          p=TeamMember(team=k[x],members=get_object_or_404(Employee,unique_id=y)) 
          p.save() 

Merci beaucoup!

Répondre

2

Il serait utile que vous ayez inclus une pile (plutôt que l'erreur). Mais des regards de celui-ci, vous devez enregistrer les instances du modèle intermédiaire:

Je cite the docs:

Maintenant que vous avez configuré votre ManyToManyField utiliser votre modèle intermédiaire, vous êtes prêt à commencer à créer des relations plusieurs-à-plusieurs. Vous le faites en créant des instances du modèle intermédiaire ... Contrairement aux champs plusieurs-à-plusieurs normaux, vous ne pouvez pas utiliser ajouter, créer ou assigner pour créer des relations ... La seule façon de créer ce type de relation est de créer des instances du modèle intermédiaire.