Чтение полей в django admin/inline

Я использую этот фрагмент, чтобы отображать несколько полей в моем бэкэнде администратора как только для чтения, но, как замечено в комментариях, он не работает на stackedinline/tabularinline. Есть ли другой способ достичь этого? У меня есть список объектов, прикрепленных к модели, и просто хочу показать их в представлении деталей модели без возможности изменения значений.

Ответ 1

Если вы используете Django 1.3 или новее; там есть атрибут ModelAdmin.readonly_fields, который вы могли бы использовать.

InlineModelAdmin наследуется от ModelAdmin, поэтому вы можете использовать его из своего встроенного подкласса.

Ответ 2

Сегодня я столкнулся с такой же проблемой. Вот мое решение. Это пример поля только для чтения для значения ForeignKey:

class MySelect(forms.Select):
    def render(self, name, value, attrs=None, choices=()):
        s = Site.objects.get(id=value)
        return s.name

class UserProfileInlineForm(forms.ModelForm):
    site = forms.ModelChoiceField(queryset=Site.objects.all(), widget=MySelect)

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    form = UserProfileInlineForm

Ответ 3

Как и в случае с JQuery, похоже, вы можете добиться этого, изменив attr, называемый "отключенным" (работает в моем Safari, ОК, мы сейчас в 2013 году:-)). Пример ниже:

def get_form(self, request, obj=None, **kwargs):
        result = super(<your ModelAdmin class here>, self).get_form(request, obj=obj, **kwargs)
        result.base_fields[<the select field you want to disable>].widget.attrs['disabled'] = 'disabled'
        return result