2014-12-07 90 views
3

當管理員list_editable與限制自定義管理器一起使用時,我遇到了一些奇怪的行爲。每次嘗試保存管理員列表中的更改時,都會收到以下消息:請更正以下錯誤。Django管理員列表編輯

有關如何擺脫此錯誤消息的任何建議?

下面是一個最小的例子:

models.py

from django.db import models 

class RestrictedManager(models.Manager): 
    def get_queryset(self): 
     return super(RestrictedManager, self).get_queryset().none() 


class MyModel(models.Model): 
    on = models.BooleanField() 

    objects = RestrictedManager() 
    all_objects = models.Manager() 

admin.py

from django.contrib.admin import ModelAdmin, site 
from models import MyModel 

class MyModelAdmin(ModelAdmin): 
    list_editable = ('on',) 
    list_display = ('id', 'on',) 

    def get_queryset(self, request): 
     return MyModel.all_objects 

site.register(MyModel, MyModelAdmin) 

如果你想知道,爲什麼我用none()默認查詢集, 我不。我僅使用none()來簡化示例。任何由默認管理器過濾掉的對象都會出現問題。

回答

1

我還沒有測試過,但可能問題是,你已經覆蓋了默認管理器。

從Django文檔:Default managers

如果使用自定義Manager對象,請注意該第一個Manager Django遇到(在其中他們在模型中定義的順序)有着特殊的地位。 Django將類中定義的第一個Manager解釋爲「默認」管理器,並且Django的多個部分(包括dumpdata)將專門爲該模型使用該管理器。因此,在選擇默認管理器時要小心,以避免覆蓋get_queryset()導致無法檢索想要使用的對象的情況。

所以首先使用你的「UnrestrictedManager」,你的自定義管理器作爲第二個應該做的伎倆。

+0

Django似乎不鼓勵我的方法。謝謝! – Yossi 2015-05-06 08:05:38

0

我通過使用簡單的管理器創建代理模型來解決此問題。

class UnrestrictedMyModel(MyModel): 
    objects = models.Manager() 

    class Meta: 
     proxy = True 

site.register(UnrestrictedMyModel, MyModelAdmin) 

但我仍在尋找更好的解決方案。