Форматирование поля формы только для чтения - PullRequest
1 голос
/ 18 декабря 2011

Я хочу отображать поле только для чтения в форме ModelAdmin, поэтому я добавил его в атрибут readonly_fields.

Однако, поскольку поле содержит валюту, хранящуюся в виде целого числа, я хочу применить ее форматирование. Я создал пользовательский ModelForm для моего ModelAdmin, пытаясь применить форматирование в переопределенном методе __init__.

Проблема в том, что я не могу найти значение. Поле отсутствует в атрибуте self.fields.

Кто-нибудь знает, где хранятся значения для readonly_fields, или есть лучший / иной подход?

Ответы [ 3 ]

3 голосов
/ 18 декабря 2011

Альтернативный подход, который работает для всех типов форм, заключается в создании виджета для представления поля только для чтения. Вот тот, который я написал для собственного использования. Вы можете изменить <span %s>%s</span> в соответствии со своими требованиями.

from django import forms
from django.utils.safestring import mark_safe
from django.utils.encoding import force_unicode


class ReadOnlyWidget(forms.TextInput):
    def render(self, name, value, attrs=None):
         if value is None:
             value = ''
         final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
         if value != '':
             # Only add the 'value' attribute if a value is non-empty.
             final_attrs['value'] = force_unicode(self._format_value(value))
         return mark_safe(u'<span%s />%s</span>' % (flatatt(final_attrs),value))

Как только вы добавите это, просто сделайте это:

class MyAdmin(admin.ModelAdmin):
    foo = models.TextField(widget=ReadOnlyWidget(attrs={'class':'read-only'}
                           initial="$50")

Затем в вашем CSS сделайте некоторые стили для класса read-only, или вы можете соответствующим образом настроить атрибуты.

2 голосов
/ 18 декабря 2011

Просто сделайте что-то вроде:

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

    def foo(self, obj):
        return '${0}'.format(obj.amount)
1 голос
/ 28 ноября 2018

Другое, более подходящее решение, работает в Django 2.1.2:

ModelAdmin отображает поля только для чтения с помощью специальной оболочки AdminReadonlyField (django / contrib / admin / helpers.py), еслимы смотрим на метод contents, мы видим код

if getattr(widget, 'read_only', False):
    return widget.render(field, value)

Это означает, что если виджет имеет атрибут read_only со значением True, то поле только для чтения вызовет метод рендеринга виджета.Следовательно, вы можете использовать метод рендеринга для форматирования вашего значения.

Например:

class CustomDateInput(widgets.DateInput):
    read_only = True

    def _render(self, template_name, context, renderer=None):
        return 'you value'

class CustomForm(forms.ModelForm):
    some_field = forms.DateTimeField(widget=CustomDateInput())

@admin.register(SomeModel)
class SomeModelAdmin(admin.ModelAdmin):
    form = CustomForm    
    readonly_fields = ['some_field']
...