2013-02-12 2 views
5

Я хочу отображать мой виджет в поле в admin django, когда поле только для чтения.django admin Как отображать виджет на поле только для чтения

admin.py

class AudioTrackAdminInline(admin.StackedInline): 
    model = AudioTrack 
    form = AudioTrackForm 
    readonly_fields = ('file',) 

forms.py

class AudioTrackForm(forms.ModelForm): 
    class Meta: 
     model = AudioTrack 
     widgets = { 'file': MediaFileInput, } # my widget 

Если файл не только для чтения, отображается виджет OK. Но когда я включаю его как readonly, я вижу текстовую строку. (Django не должен использовать мою форму, если только только для чтения)

Как я могу использовать эту форму даже в поле readonly?

или

Как отобразить другой виджет, если я установить мое поле только для чтения?

ответ

4

Я бы сказал, что это особенность.

Когда поле задано только для чтения, Django использует функцию display_for_field, которая скорректирует результат, вы не можете ее настроить.

Другим подходом было бы не устанавливать поле как только для чтения и переопределять formfield_for_dbfield, недокументированный метод ModelAdmin и действовать в соответствии с вашими потребностями.

3

Альтернативные и более гибкое решение установить «инвалид» атрибут тех полей, которые вы хотите сделать в только для чтения режима, перекрывая get_form(...) метод вашего класса администратора:

def get_form(self, *args, **kwargs): 

    form = super(SupplierAdmin, self).get_form(*args, **kwargs) 

    for field_name in self.fake_readonly_fields: 
     form.base_fields[field_name].disabled = True 

    return form 

к сведению, что я взять имя только для чтения полей не из обычного self.readonly_fields, но из другого массива, который я назвал self.fake_readonly_fields, чтобы избежать имя перекрывается

предел предлагаемого решения (с использованием formfield_for_dbfield) является то, что в этом случае вы оказываете на так же все поля базы данных ag iven, то он должен быть доступен только для чтения или нет. Этот способ работает, если вся ваша форма должна быть только для чтения, но если вы занимаетесь формами, которые наполовину доступны только для чтения, а половина нет, лучше полагаться на атрибут disabled.

Более подробную информацию о моем ответе здесь: django modeladmin, readonly_fields and boolean fields

+0

Это следует использовать '' disabled' Field' атрибут, так как не все виджеты поддерживают (HTML) атрибут (например, с 'django.contrib.gis.forms. fields.PointField'), и он может быть изменен пользователем! Поэтому необходимо использовать 'form.base_fields [field_name] .disabled = True'. – blueyed

Смежные вопросы