List_editable и виджеты

При использовании list_editable в ModelAdmin существует ли способ изменить виджет, используемый для редактируемых полей? Я не могу найти ничего в документации. Похоже, это было бы то, что вы могли бы настроить.

Ответ 1

Переопределить метод get_changelist_form вашего класса ModelAdmin, например:

def get_changelist_form(self, request, **kwargs):
  kwargs.setdefault('form', MyAdminForm)
  return super(MyModelAdmin, self).get_changelist_form(request, **kwargs)

И отдельно определите модифицированный MyAdminForm:

class MyAdminForm(forms.ModelForm):
  class Meta:
     model = MyModel
  my_field = forms.DateField(widget=widgets.AdminDateWidget())

Это просто пример, который сделает my_field представленным виджетами только для даты (без времени). Это выглядит намного лучше в представлении списка.

Ответ 2

Если вы хотите изменить только виджет (проверено на django 1.5) (вам не нужно указывать ect.) использовать этот синтаксис:

from django import forms

class OfferForm(forms.ModelForm):
    class Meta:
        model = Offer
        widgets = {
            'description' : forms.Textarea(
                attrs={
                    'cols': '20',
                }
            )
        }

Где widgets dict - это dict, ключи которого являются именами полей и значений, представляют виджеты, которые вы хотите переопределить.

В качестве документации указано для django 1.5+, это также возможно:

class OfferAdmin(admin.ModelAdmin):
    def get_changelist_form(self, request, **kwargs):
        return OfferForm

Без каких-либо super() и kwargs жонглирования.