2012-03-15 65 views
2

我有Chart和模塊模型(請參閱下面的代碼)。每個圖表都屬於一個模塊(通過ForeignKey)。圖表可能有其他圖表parent(另一個ForeignKey)。我在管理員中想要的是,特定圖表上的parent的下拉列表僅包含相同模塊中的圖表。Django admin:如何根據對象的(不是request.user)數據過濾ForeignKeyField小部件?

我正在尋找一個Python解決方案,而不是AJAX。這意味着在創建新圖表時,下拉列表必須是空的(沒有模型實例沒有選擇模塊),並且更改管理模塊不會更新parent選項以匹配,直到保存模型。我確定。

有很多類似聽起來的問題(和答案),結果根據用戶篩選選項; ModelAdmin.formfield_for_foreignkey將請求作爲參數獲取,因此您可以使用request.user,但它沒有獲取模型實例。 (我使用Django 1.3。)

我的模型(高度簡化當然):

class Module(models.Model): 
    pass 

class Chart(models.Model): 
    module = models.ForeignKey(Module) 
    parent = models.ForeignKey(Chart, blank=True, null=True) 

class ChartAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     # I would like to do this, but have no "instance": 
     kwargs['queryset'] = Chart.objects.filter(module=instance.module) 
     return super(ChartAdmin, self).formfield_for_foreignkey(self, db_field, request, **kwargs) 

admin.site.register(Chart, ChartAdmin) 

回答

2

只是覆蓋ModelForm使用:

class ChartAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ChartAdminForm, self).__init__(*args, **kwargs) 
     if self.instance.module_id: 
      self.fields['parent'].queryset = self.fields['parent'].queryset.filter(module=self.instance.module) 

class ChartAdmin(admin.ModelAdmin): 
    form = ChartAdminForm 
    ... 
+0

很好,謝謝!我添加了一個編輯(在隊列中),以便它可以安全地創建實例(當self.instance.module產生一個DoesNotExist時)。 – Tikitu 2012-03-15 15:35:15

2

從我在源代碼中所看到的,kwargs應該只包含小部件(沒有幫助! )。

一個可能的黑客攻擊,可能是重寫get_form()modeladmin方法,只是設置request.current_object。然後,你可以在formfield_callback使用request.current_object:

def get_form(self, request, obj=None, **kwargs): 
    request.current_object = obj 
    return super(ChartAdmin, self).get_form(request, obj, **kwargs) 

def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    instance = request.current_object 

    kwargs['queryset'] = Chart.objects.filter(module=instance.module) 
    return super(ChartAdmin, self).formfield_for_foreignkey(self, db_field, request, **kwargs) 
+0

感謝JPIC,只是用你的代碼和偉大工程 – Nick 2013-05-30 06:47:28

相關問題