2015-10-29 15 views
7

Czy istnieje mimo to opcja list_editable opcjonalna dla baz obiektów? Na przykład atrybut pola tylko do odczytu ma tę opcję, która nie ma wpływu na widok listy zmian.Django warunkowe admin list_editable

class MyAdmin(admin.ModelAdmin): 
    readonly_fields = ('foo',) 

    def get_readonly_fields(self, request, obj=None): 
     fields = super(MyAdmin, self).get_readonly_fields(request, obj=obj) 

     if obj.status == 'CLOSED': 
      return fields + ('bar',) 
     return fields 

To samo można osiągnąć dla display_zestawu i niektórych innych atrybutów. Wygląda na to, że nie ma metody "get_list_editable_fields".

Chcę, aby niektóre wiersze były niezmienne oczywiście, ale inne niż podnoszenie wulgarnego błędu nie działa. Nie znalazłem żadnej dokumentacji na temat atrybutu ani

Czy w jakiś sposób można renderować widżet za pomocą programu pobierającego listę_listy?

class MyAdmin(admin.ModelAdmin): 
    list_display = ('get_bar',) 
    list_editable = ('get_bar',) 

    def get_bar(self, obj): 
     return widget or str(obj.bar) # ??? 
    get_bar.allow_tags = True 

aktualizacja za pomocą zwrotnej Alasdair za:

def get_changelist_formset(self, request, **kwargs): 
    """ 
    Returns a FormSet class for use on the changelist page if list_editable 
    is used. 
    """ 
    # I run through this code for each row in the changelist, but there's nothing in kwargs, so I don't know how to use the instance as a guide to which fields should be in list_editable? 

    defaults = { 
     "formfield_callback": partial(self.formfield_for_dbfield, request=request), 
    } 
    defaults.update(kwargs) 
    return modelformset_factory(
     self.model, self.get_changelist_form(request), extra=0, 
     fields=self.list_editable, **defaults 
    ) 

Odpowiedz

1

jak mówisz, nie ma get_list_editable metoda. Przetasuj metodę . Myślę, że musisz zduplikować całą metodę i zmienić listę pól przekazanych do modelformset_factory.

+0

Nie rozumiem, jak uzyskać bieżące wystąpienie w sposobie, biegnę za pomocą metody dla każdego wiersza, ale jest kwargs pusty? zobacz moje zaktualizowane pytanie – trb

+0

Nie jestem pewien, jaka jest odpowiedź, jesteś dość głęboko w kodzie administratora! Konieczne może być również zastąpienie 'get_changelist_form'. Powodzenia! – Alasdair

+0

Ustawiłem to na właściwej ścieżce. W końcu dwukrotnie zarejestrowałem model na administratorze (który wymaga hackowania modelu proxy) i stworzono własny zestaw reguł administratora. Ten wymóg naprawdę uderza w granice administratora django :-) – trb

0

Ponadto, można zastąpić changelist_view i zrobić coś takiego:

def changelist_view(self, request, extra_context=None): 
     resp = super(CustomModelAdmin, self).changelist_view(request, extra_context) 
     if something: 
      resp.context_data['cl'].formset = None 

     return resp