2013-02-20 99 views
2

我有兩個模型,'產品'和'範圍',要連接到許多領域。 '產品'類是在我沒有寫的應用程序中,所以它不能被修改(我可以編輯它的模式)。我想讓'Ranges'a'Product'在管理員中可以編輯,我想用一個FilteredSelectMultiple而不是內嵌管理員來完成。在Django的管理員如何添加一個字段的ManyToManyField的背面

簡化 'models.py':

class Product(models.Model): 
    name = models.CharField(max_length=64) 
    #etc... 
    #I can't modify this class 

class Range(models.Model): 
    name = models.CharField(max_length=32) 
    products = models.ManyToManyField(Product, related_name='ranges') 

和admin.py:

class ProductAdmin(admin.ModelAdmin): 
    # What do I put here to get a multi-select box for ranges? 
    # Preferrably with one of those 'add' buttons to popup a window 
    # to add ranges. 

如果我可以修改我的產品使用現有的通過表,這可以把一個ManyToManyField就可以了工作正常,但據說我不能(或不會,因爲它會使升級到外部應用程序真正的痛苦)。

在此先感謝您的幫助! (PS我希望在這裏很容易看到爲什麼我不想使用內聯管理員表單 - 這使得UI不必要的複雜)。

回答

2

對不起,它可能有點晚,但任何人谷歌搜索可能會受益於這個答案。這並不容易,但它是可行的。您必須構建自己的表單(如果需要,可從現有表單下載),然後手動加載並保存項目。

from django import forms 
from django.contrib import admin 

class ProductForm(forms.ModelForm): 
    # <- your own fields declaration 
    ranges = forms.ModelMultipleChoiceField(
     label='Ranges', 
     queryset=Range.objects.all(), 
     required=False, 
     widget=admin.widgets.FilteredSelectMultiple("ranges", is_stacked=False)) 

    class Meta: 
     model = Product 


class MyProductAdmin(admin.ModelAdmin): 

    def save_model(self, request, obj, form, change): 
     # Save first to obtain id 
     super(MyProductAdmin, self).save_model(request, obj, form, change) 
     # Clean and re-add related objects 
     obj.range_set.clear() 
     for range in form.cleaned_data['ranges']: 
      obj.range_set.add(range) 

    def get_form(self, request, obj=None, **kwargs): 
     if obj: 
      ProductForm.base_fields['ranges'].initial = [o.pk for o in obj.range_set.all()] 
     else: 
      ProductForm.base_fields['ranges'].initial = [] 
     return ProductForm 

# unregister and register again 
admin.site.unregister(Product) 
admin.site.register(Product, MyProductAdmin) 
+0

非常感謝,我想出了類似的東西,打算把它作爲一個答案,但現實生活中的方式。 – DaedalusFall 2013-11-13 18:05:22

相關問題