2014-12-26 129 views
1

我想过滤模型中的多对多字段。模型中的多对多字段的过滤器选择django

class IdealBehaviour(models.Model): 
    cbs_role = models.ManyToManyField(CbsRole, null=True, blank=True) 
    cbs = models.ForeignKey('cbs.CBS', null=True, blank=True) 
    ideal_behaviour = models.CharField(max_length=500, null=True, blank=True) 
    Description = models.CharField(max_length=1000, null=True, blank=True) 
    created_time = models.DateTimeField(auto_now_add = True,null=True, blank=True) 

class StandardWork(models.Model): 
    cbs_and_role = models.ManyToManyField('userdata.CbsRole', null=True, blank=True) 
    standard_work_number = models.BigIntegerField(null=True, blank=True) 
    system_name= models.CharField(max_length=500, null=True, blank=True) 
    system_description=models.TextField(null=True, blank=True) 
    ideal_behaviour = models.ManyToManyField ('userdata.IdealBehaviour', null=True, blank=True) 
    publish = models.BooleanField(default=False) 
    created_time = models.DateTimeField(auto_now_add = True,null=True, blank=True) 

class TodoListForm(ModelForm): # used in manage view 
    class Meta: 
     model = StandardWork 
     exclude = ('publish', 'cbs_and_role', 'standard_work_number') 
     widgets = { 
       'system_description': forms.Textarea(attrs={'rows':3}), 
      } 

我想,因为只有idealbehaviour显示ideal_behaviour的选择在TodoListForm查询

cbsobject = CBS.objects.get(id=dat) 
idealbehaviour = IdealBehaviour.objects.filter(cbs=cbsobject) 

我想选择的ideal_behaviour。

我如何查询显示理想行为assosciated与该perticuler cbs只在modelform?

我得到了解决

def __init__(self, *args, **kwargs): 
     super(PollForm, self).__init__(*args, **kwargs) 
     if self.instance: 
      print "printing in form" 
      print self.instance.id 
      self.fields['ideal_behaviour'].queryset = IdealBehaviour.objects.filter(cbs__exact=self.instance.id) 

,但我不如何获得CBS的ID。 self.instance.id提供标准作业ID。我想要cbs的id。即我想在形式上作为一个实例的cbsobject。之后,它的工作正常。

回答

2

得到了解决方案。我不知道它的可行与否,但我把表格放在视图文件中,所以我可以得到cbsobject的实例。

class PollForm(forms.ModelForm): # used in manage view 
        class Meta: 
         model = StandardWork 
         exclude = ('cbs_and_role','publish', 'standard_work_number') 
         widgets = { 
          'system_description': forms.Textarea(attrs={'rows':3}), 
         } 
        def __init__(self, *args, **kwargs): 
         super(PollForm, self).__init__(*args, **kwargs) 
         if self.instance: 
          print "printing in form" 
          print self.instance.id 
          self.fields['ideal_behaviour'].queryset = IdealBehaviour.objects.filter(cbs__exact=cbsobject) 

如果有更好的解决方案,请让我知道。并请指导我这个接近这个词的不好。谢谢。