2014-10-30 93 views
0

我想使用查詢集過濾出現在表單的M2M字段中的選項。我讀過limit_choices_to只能用於ForeignKey。是否有類似limit_choices_to可以應用於M2M?使用queryset過濾django M2M字段選項

這是我的模型:

class Inspection(models.Model): 

    ref   = models.CharField(max_length=50) 
    tools  = models.CharField(max_length=150,null=True,blank=True) 
    areas  = models.ManyToManyField('specimens.Area',null=True,blank=True) 

這是M2M領域的典範:

class Area(models.Model): 

    ref   = models.CharField(max_length=10) 
    description = models.TextField(max_length=150) 
    specimen = models.ForeignKey(Specimen) 

    class Meta: 
     unique_together = ['ref','specimen'] 

我會想過濾與查詢集inspection_areas: Area.objects.filter(specimen="specimen")

其他發帖(Many to many and how to get a queryset from queryset)解釋了一種方法來做到這一點,改變了我認爲的管理形式(我不太瞭解它),但這並不爲我工作,得到DoesNotExist錯誤或Super錯誤。我是否必須更改我的InspectionForm以表示該帖子之前的InspectionAdminForm

enter image description here

任何想法?

EDIT-1:

本人已認識到它拋出其他不同的錯誤:

enter image description here

這是我已經使用的完整代碼:

class InspectionAdminForm(forms.ModelForm): 

    class Meta: 
     model = Inspection 

    def __init__(self, *args, **kwargs): 
     super(InspectionAdminForm,self).__init__(*args,**kwargs) 
     self.fields['areas'].queryset = Area.objects.filter(specimen=self.instance.specimen) 



class InspectionAdmin(admin.ModelAdmin): 
    form = InspectionAdminForm 
    filter_horizontal = ['areas'] 
+0

您在設置模型後執行了'makemigrations'和'migrate'嗎?它看起來不知道把數據放在哪裏(也不能從中獲取)...... – mccc 2014-10-30 08:49:16

+0

你是對的。我忘記了遷移。解決了最新的錯誤。我現在沒有任何錯誤,但查詢集過濾器只能在我的管理視圖中使用,而在我的表單中,我仍然可以查看所有區域選項而不進行過濾。 – DavidRguez 2014-10-30 08:55:35

回答

0

正如我設置一些初始參數給我的Inspection modelForm,我設置:

inspectionform = InspectionForm(None, initial={'specimen':specimen}) 

我也改變了__init__方法InspectionForm的:

class InspectionForm(forms.ModelForm): 

    class Meta: 
     model = Inspection 

    def __init__(self, *args, **kwargs): 
     super(InspectionForm,self).__init__(*args,**kwargs) 
     self.fields['areas'].queryset = Area.objects.filter(specimen=kwargs['initial']['specimen'].id) 

而這一切!現在它運作良好。