嗨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)
答案 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
而不是表单上的自定义字段?