sábado, 3 de outubro de 2009

Brincando com o Django

Esta semana estive brincando com o Django. Corrigindo: há algum tempo estou brincando com ele, pois estamos implementando o sistema administrativo da FEBRACE lá no LSI-NATE.

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!

2 comentários:

  1. Adoro esses posts em que não entendo nada. Até ontem, django, para mim, era a pronúncia da palavra "selva" em inglês.

    ResponderExcluir
  2. Ah, e python é uma cobra grande. Daquelas que dão baita medo.

    ResponderExcluir