Django:在重写表单字段后,将筛选器_水平消失

Django:在重写表单字段后,将筛选器_水平消失,django,django-forms,Django,Django Forms,我在模型中有许多字段: models.py pages = models.ManyToManyField(Page, verbose_name='Pages', blank=True) filter_horizontal = ['pages',] class BannerAdminForm(forms.ModelForm): pages = forms.ModelMultipleChoiceField(queryset=Page.objects.filter(publisher_is

我在模型中有许多字段:

models.py

pages = models.ManyToManyField(Page, verbose_name='Pages', blank=True)
filter_horizontal = ['pages',]
class BannerAdminForm(forms.ModelForm):
    pages = forms.ModelMultipleChoiceField(queryset=Page.objects.filter(publisher_is_draft=0), label='Pages')

    class Meta:
        model = Banners
class BannersAdmin(admin.ModelAdmin):
    form = BannerAdminForm
    filter_horizontal = ['pages',]
对于管理界面水平过滤器工作正常:

admin.py

pages = models.ManyToManyField(Page, verbose_name='Pages', blank=True)
filter_horizontal = ['pages',]
class BannerAdminForm(forms.ModelForm):
    pages = forms.ModelMultipleChoiceField(queryset=Page.objects.filter(publisher_is_draft=0), label='Pages')

    class Meta:
        model = Banners
class BannersAdmin(admin.ModelAdmin):
    form = BannerAdminForm
    filter_horizontal = ['pages',]
但当我使用forms.Modelform(用于更改queryset)覆盖此字段时,在界面中,它开始显示为一个简单的
字段:

forms.py

pages = models.ManyToManyField(Page, verbose_name='Pages', blank=True)
filter_horizontal = ['pages',]
class BannerAdminForm(forms.ModelForm):
    pages = forms.ModelMultipleChoiceField(queryset=Page.objects.filter(publisher_is_draft=0), label='Pages')

    class Meta:
        model = Banners
class BannersAdmin(admin.ModelAdmin):
    form = BannerAdminForm
    filter_horizontal = ['pages',]
admin.py

pages = models.ManyToManyField(Page, verbose_name='Pages', blank=True)
filter_horizontal = ['pages',]
class BannerAdminForm(forms.ModelForm):
    pages = forms.ModelMultipleChoiceField(queryset=Page.objects.filter(publisher_is_draft=0), label='Pages')

    class Meta:
        model = Banners
class BannersAdmin(admin.ModelAdmin):
    form = BannerAdminForm
    filter_horizontal = ['pages',]

这个问题有什么解决办法吗?我查找了一些适用于modelmultipleechoicefield的特殊小部件,但没有找到任何东西。

请看,您可以将字段的小部件指定为
FilteredSelectMultiple
请看,您可以将字段的小部件指定为
FilteredSelectMultiple

这并不能解决实际问题,但是设置查询集的另一种方法:

class BannerAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
         super(BannerAdminForm, self).__init__(*args, **kwargs)
         self.fields['pages'].queryset = Page.objects.filter(publisher_is_draft=0)

    class Meta:
        model = Banners

这并没有解决实际问题,而是设置查询集的另一种方法:

class BannerAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
         super(BannerAdminForm, self).__init__(*args, **kwargs)
         self.fields['pages'].queryset = Page.objects.filter(publisher_is_draft=0)

    class Meta:
        model = Banners

陛下要写很多代码。。。但我认为这种改变可能会很有效。。。要写很多代码。。。但我认为这种改变也可能奏效