2013-02-20 97 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

相关问题