Django:ManyToMany小部件不会显示为双列表

时间:2012-04-01 01:59:10

标签: django filter django-admin widget many-to-many

嗨Stackoverflow人,

我想将管理页面(以及后来的实际django网站)中的m2m小部件更改为更加用户友好的双重列表(如此one)。

我知道django.contrib.admin.widgets.FilteredSelectMultiple可以为我做这件事。但是,我很难让它发挥作用。我已将下面的代码添加到我的admin.py中,但是当我在管理员应用程序中查看模型时,小部件不会更改。

我试图采用here中的代码。每个SupplierProfile都应该从WorldBorder模型连接到一个或多个国家/地区(基于GeoDjango example

代码中的缺陷在哪里?我不明白为什么它不会显示。 谢谢你的帮助!

from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.gis import admin
from django.utils.translation import ugettext_lazy as _

from apps.profile.models import (UserProfile,
                                  SupplierProfile)
from apps.gis_data.models import WorldBorder


class WorldBorderAdmin(admin.ModelAdmin):
    filter_horizonal = ('name',)

class SupplierProfileAdminForm(forms.ModelForm):
    distribution_location_country = forms.ModelMultipleChoiceField(
        queryset = WorldBorder.objects.all(), 
            required = False,
            widget = FilteredSelectMultiple(
            verbose_name = _('Distribution Country'),
            is_stacked=False
        )
     )

    class Meta:
        model = SupplierProfile

    def __init__(self, *args, **kwargs):
        super(SupplierProfileAdminForm, self).__init__(*args, **kwargs)

        if self.instance:
          self.fields['distribution_location_country'].initial = self.instance.distribution_location_country.all()

    def save(self, commit=True):
        profile = super(SupplierProfileAdminForm, self).save(commit=False)

        profile.distribution_location_country = self.cleaned_data['distribution_location_country']

        if commit:
            profile.save()
            profile.save_m2m()

        return profile

class SupplierProfileAdmin(admin.ModelAdmin):
    form = SupplierProfileAdminForm

admin.site.register(SupplierProfile, admin.OSMGeoAdmin)

更新了admin.py的代码

是否可以按如下所述定义双重列表? “distribution_location_country”是我的SupplierProfile中的m2m字段。出于某种原因,它仍然没有通过。

from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.gis import admin

class SupplierProfileAdmin(admin.OSMGeoAdmin):
    filter_horizontal = ('distribution_location_country', )

admin.site.register(SupplierProfile, SupplierProfileAdmin)

1 个答案:

答案 0 :(得分:1)

您的register行似乎有误:

admin.site.register(SupplierProfile, admin.OSMGeoAdmin)

未向您的模型注册自定义的SupplierProfileAdmin

也许您希望SupplierProfileAdmin的基类为OSMGeoAdmin而不是ModelAdmin

class SupplierProfileAdmin(admin.OSMGeoAdmin):
    form = SupplierProfileAdminForm

和您的注册行

admin.site.register(SupplierProfile, SupplierProfileAdmin)

另外,我对此不太确定,但您可能只能使用

filter_horizonal = ('name_of_the_m2m_field_on_the_model', )

SupplierProfileModel而不是表单上的自定义字段?