2011-09-01 58 views
2

这个问题与这些ab类似,但有点不同。我对django很陌生,所以请耐心等待。下面是我的模型Django中介模式保存()问题

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) 

和我一般视图类

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() 

,我得到这个错误。

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

请建议,如果有人有另一种解决方案(我真的不希望洒逻辑到单独的形式)。感谢您的帮助,谢谢!

**更新:找到解决方案here。这是我的解决方案,

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() 

非常感谢!

回答

2

如果你包含一个堆栈跟踪(而不是仅仅是错误),这将是有帮助的。但是从外观上来看,你需要保存中间模型的实例:

the docs报价:

现在你已经设置了ManyToManyField使用您的中介模式,你就可以开始创建一些多对多的关系。您通过创建中间模型的实例来完成此操作......与正常的多对多字段不同,您不能使用添加,创建或分配来创建关系......创建此类关系的唯一方法是创建中间模型的实例。