【问题标题】:Filtering django M2M field options with queryset使用查询集过滤 django M2M 字段选项
【发布时间】:2014-10-30 08:33:01
【问题描述】:

我想使用查询集过滤出现在表单的 M2M 字段中的选项。我读过limit_choices_to 只能与ForeignKey 一起使用。有没有类似limit_choices_to 的东西可以应用于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 错误或 @987654330 @错误。我是否必须将我的InspectionForm 更改为之前发布帖子的InspectionAdminForm

有什么想法吗?

EDIT-1:

我意识到它会引发其他不同的错误:

这是我用过的完整代码:

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']

【问题讨论】:

  • 您在设置模型后是否执行了makemigrationsmigrate?看起来它不知道将您的数据放在哪里(也不知道从哪里获取)......
  • 你是对的。我忘了迁移。解决了最新的错误。我现在没有任何错误,但查询集过滤器仅在我的管理员视图中有效,而在我的表单中,我仍然查看所有区域选项而不进行过滤。

标签: django django-queryset manytomanyfield


【解决方案1】:

因为我已经为我的 Inspection modelForm 设置了一些初始参数,所以我设置了:

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

我还更改了 InspectionForm 的 __init__ 方法:

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)

仅此而已!现在效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2014-02-11
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多