如何过滤django表单中的多对多字段

如何过滤django表单中的多对多字段,django,django-models,django-forms,django-queryset,Django,Django Models,Django Forms,Django Queryset,我有一个模型选举,它有一个“候选人”字段,与候选人模型存在多对多关系,还有一个“地区”字段,与地区模型存在一对多关系。此外,候选模型还具有区域字段,该字段也与区域模型具有一对多关系 现在我创建了一个模型选举的模型形式。我的问题是如何筛选特定地区的候选人 这是我的模型和表格 class Region(models.Model): region_name = models.CharField(max_length=200, null=True) region_id = models

我有一个模型选举,它有一个“候选人”字段,与候选人模型存在多对多关系,还有一个“地区”字段,与地区模型存在一对多关系。此外,候选模型还具有区域字段,该字段也与区域模型具有一对多关系

现在我创建了一个模型选举的模型形式。我的问题是如何筛选特定地区的候选人

这是我的模型和表格

 class Region(models.Model):
    region_name = models.CharField(max_length=200, null=True)
    region_id = models.CharField(max_length=20, null=True, unique=True)

    def __str__(self):
        return self.region_name

 class Candidate(models.Model):
    region = models.ForeignKey(Region, null=True, on_delete=models.SET_NULL)
    name = models.CharField(max_length=200, null=True)
    party_name = models.CharField(max_length=200, null=True)
    candidate_id = models.CharField(max_length=10, null=True, unique=True)

    def __str__(self):
        return self.name

 class Election(models.Model):
    admin = models.ForeignKey(Admin, null=True, on_delete=models.SET_NULL)
    region_name = models.ForeignKey(Region, null=True, on_delete=models.SET_NULL)
    region_id = models.CharField(max_length=200, null=True)
    date_created = models.DateField(null=True)
    candidates = models.ManyToManyField(Candidate)
    winner = models.CharField(max_length=200, blank=True) 

 class NewElectionForm(forms.ModelForm):
    class Meta:
        model = Election
        exclude = ['winner']
    def __init__ (self, *args, **kwargs):
        super(NewElectionForm, self).__init__(*args, **kwargs)
        self.fields["candidates"].widget = forms.widgets.CheckboxSelectMultiple()
                #below query is for testing
        #region = Region.objects.get(region_name='Mumbai')
        self.fields["candidates"].queryset = region.candidate_set.all()
每个地区都有一个管理员,他将发布此表单。因为region\u name在这里是变量,所以我无法运行region.candidate\u set查询 如果上述方法不可行,是否还有其他解决方案

Candidate.objects.filter(region__region_name="Mumbai")

上面的查询将为您提供带有region=“Mumbai”

的所有候选人,因为表单将由某个地区的管理员发布,并且选举模型的外键为admin,因此您可以按管理员筛选选举,从而为您提供来自该地区管理员的候选人

在呈现此表单的视图中,添加一个方法

    class YourView(...):
        .....

        # This inserts 'admin' into kwargs of the form BEFORE it's loaded
        def get_form_kwargs(self):
            kwargs = super(YourView, self).get_form_kwargs()
            kwargs['admin'] = self.request.user
            return kwargs


    class NewElectionForm(forms.ModelForm):
        class Meta:
            model = Election
            exclude = ['winner']
        def __init__ (self, *args, **kwargs):

            #instanciate the admin variable that you inserted into kwargs
            admin = kwargs.pop('admin')
            super(NewElectionForm, self).__init__(*args, **kwargs)
            self.fields["candidates"].widget = forms.widgets.CheckboxSelectMultiple()
            self.fields["candidates"].queryset = Election.objects.filter(admin=admin)
或 如果您的管理模型具有区域字段

        def get_form_kwargs(self):
            kwargs = super(YourView, self).get_form_kwargs()
            kwargs['region'] = self.request.user.region
            return kwargs
然后查询候选模型,如下所示:

    class NewElectionForm(forms.ModelForm):
        class Meta:
            model = Election
            exclude = ['winner']
        def __init__ (self, *args, **kwargs):

            #instanciate the region variable that you inserted into kwargs
            region = kwargs.pop('region')
            super(NewElectionForm, self).__init__(*args, **kwargs)
            self.fields["candidates"].widget = forms.widgets.CheckboxSelectMultiple()
            self.fields["candidates"].queryset = Candidate.objects.filter(region=region)

太宽了,区域变量来自哪里?它是登录用户所在的区域,还是将由访问者提供?