1

ユーザーがスーパーユーザーである場合に追加のフィールドを追加したい、非常にカスタマイズされた Django ModelAdmins がいくつかあります。get_fieldsets メソッドをこのようにオーバーライドするよう誰かが言っている場所を見つけました

def get_fieldsets(self, request, obj=None):
    fieldsets = super(PageAdmin, self).get_fieldsets(request, obj)
    if request.user.is_superuser:
        fieldsets[0][1]['fields'].insert(0,'group')
        fieldsets[0][1]['fields'].insert(2,'is_live')
    else:
        groups = request.user.page_groups.filter(
            is_live = True,
        )
        if groups.count() > 1:
            fieldsets[0][1]['fields'].insert(0,'group')
    return fieldsets

これは (ある程度) 機能し、フィールドをフィールドセットにグループ化できるので、get_fieldsets を使用するのが好きです。フォームには、ユーザーに基づくクエリセットを持つユーザー固有のフォームフィールドがいくつかあるため、この管理者でも get_form を使用します。

def get_form(self, request, obj=None, **kwargs):
    if request.user.is_superuser:
        return PageForm
    else:
        form = RestrictedPageForm
        form.owner = request.user #(this may be a bad way to do this but it works I think)
        return form

今、スレッド化の問題であると思われる問題に直面しています。

ブラウザで change_form ページをすばやく更新すると、フォームに複数の「group」または「is_live」フィールドが表示されます。

管理者を利用してすべてを書く必要がないようにするのが本当に好きですが、これを正しく行う方法がわかりません。どんな助けや提案も大歓迎です!

4

1 に答える 1

4

fieldsets問題は、 の属性を文字通り変更していることです。ModelAdminこれは、 であるにもかかわらず、スレッドセーフではありませget_fieldsets

これを行う最善の方法は、個別のフィールドセットを指定することです。

fieldsets = (...)
restricted_fieldsets = (...)

それで:

def get_fieldsets(self, request, obj=None):
    if some_condition:
        return self.restricted_fieldsets
    else:
        return super(MyModelAdmin, self).get_fieldsets(request, obj=obj)
于 2012-08-01T17:57:08.933 に答える