2011-12-18 6 views
0

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

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

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

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

ответ

2

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

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

    def foo(self, obj): 
     return '${0}'.format(obj.amount) 
+0

Я думал, что попробовал что-то подобное, когда начал, но я, вероятно, что-то прикрутил и пошел искать более сложные решения оттуда. В любом случае, именно то, что мне нужно. Спасибо. – Krachtwerk

3

Альтернативный подход, который работает для всех типов форм для создания виджета, чтобы представить поле только для чтения. Вот один, который я написал для собственного использования. Вы можете изменить <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 класса, или вы можете настроить атрибуты соответственно.