2015-10-29 3 views
7

Есть ли способ сделать list_editable необязательным на основе каждого объекта? Например, атрибут полей readonly имеет этот параметр, который не влияет на changelist_view.Django условный администратор 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 

То же самое можно сделать для list_display и некоторых других атрибутов. Кажется, что не существует метода get_list_editable_fields.

Я хочу, чтобы некоторые из строк были неизменяемыми, но, кроме того, что они поднимали вульгарную ошибку, похоже, не работают. Я не нашел никакой документации об атрибуте

Как можно будет визуализировать виджет через list_display getter?

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 

обновления с использованием обратной связи Аласдера по:

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 
    ) 

ответ

1

Как вы говорите, нет get_list_editable метода.

Попробуйте переопределить метод get_changelist_formset. Я думаю, вам нужно будет дублировать весь метод и изменить список полей, переданных в modelformset_factory.

+0

Я не понимаю, как получить текущий экземпляр в методе, я бегу через метод для каждой строки, но kwargs является пусто? см. мой обновленный вопрос – trb

+0

Я не уверен, что ответ, вы довольно глубоко внутри кода администратора! Возможно, вам придется переопределить 'get_changelist_form', а также/вместо этого. Удачи! – Alasdair

+0

Это поставило меня на правильный путь. Я закончил тем, что дважды зарегистрировал модель на админе (для которой требуется прокси-модель) и создал собственный набор правил администратора. Это требование действительно попадает в границы администратора django :-) – trb

0

Кроме того, вы можете переопределить changelist_view и сделать что-то вроде этого:

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 
Смежные вопросы