2012-04-01 68 views
0

嗨#1人,Django的:多對多部件將不會顯示爲雙榜

我想改變在管理頁面的M2M部件(後來在實際Django的網站)的用戶更友好雙列表(像這樣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

register線似有不妥:

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

不註冊您的自定義SupplierProfileAdmin與您的模型。

也許你想在基類的SupplierProfileAdminOSMGeoAdmin而不是ModelAdmin

class SupplierProfileAdmin(admin.OSMGeoAdmin): 
    form = SupplierProfileAdminForm 

和您的註冊線是

admin.site.register(SupplierProfile, SupplierProfileAdmin) 

此外,我不知道這一點,但你可能只能使用

filter_horizonal = ('name_of_the_m2m_field_on_the_model',) 

您的SupplierProfileModel而不是表單上的自定義字段?

+0

嗨agf,什麼是正確的註冊? - > admin.site.register(SupplierProfile,admin.SupplierProfileAdmin)或 - > admin.site.register(SupplierProfile,SupplierProfileAdmin)?如果我用第一個,我得到以下錯誤:「AttributeError 異常值:v'module'對象沒有屬性'SupplierProfileAdmin'」,第二個解決方案也會引發錯誤。感謝您的幫助! – neurix 2012-04-01 02:16:48

+0

@neurix首先是一個錯字。第二個錯誤是什麼?看起來是正確的。你有沒有嘗試調整基礎班?看我的編輯。 – agf 2012-04-01 02:17:58

+0

謝謝你的幫助!隨着你的文章的變化,我得到新的錯誤「實例需要有一個主鍵值纔可以使用多對多關係」。我曾嘗試過「filter_horizo​​ntal」,但它也沒有奏效。會是更好的解決方案。你有沒有想到新的錯誤?我如何分配主鍵? – neurix 2012-04-01 02:26:55