Enfim, o fato é que usamos Django para implementar o sistema de submissão de projetos, avaliação e outras partes internas de gerenciamento. Por motivos de políticas de acesso, em diversos momentos precisamos de campos exibidos com uma permissão de "somente leitura" dentro do sistema Admin.
Pesquisando um bocado por aí, conclui que deveria criar um campo específico para este fim e usar nos formulários conforme precisássemos. Aí vai a minha ideia:
- Criar um arquivo "fields.py" (no meu caso, ele já existia)
- Inserir o trecho de código a seguir
- Usar os campos "ReadOnly" em formulários como qualquer outro Field do Django
from django.utils.encoding import force_unicode from django.utils.safestring import mark_safe class ReadOnlyWidget(forms.Widget): def render(self, name, value, attrs=None): if value is None: value = '' if value != '': # usa necessariamente Unicode value = force_unicode(value) return mark_safe(u'' % value) class ReadOnlyField(forms.Field): widget = ReadOnlyWidget() class ReadOnlyChoiceField(forms.ModelChoiceField): widget = forms.Select(attrs={'disabled':'true'})
O ReadOnlyField pode ser usado para campos "normais"; os que estabelecem relacionamento do tipo ForeignKey, devem usar o ReadOnlyChoiceField. O primeiro exibe o valor armazenado usando a tag HTML "label" e o segundo exibe um "select" desabilitado.
Faça bom proveito e deixe seus comentários!