Desabilitar um Campo no Form

1,082 views
Skip to first unread message

Victor Pantoja

unread,
Oct 5, 2009, 9:10:09 PM10/5/09
to django...@googlegroups.com
Caros

Tenho um campo definido no models.py da seguinte forma:

 identificador = models.CharField(max_length=12,default=strftime("%y%m%d%H%M%S"),unique=True)

Ou seja, é um campo pré-gerado que faz um hash simples com a data.

Problema: da maneira como está feito, o usuário pode alterar o valor do campo.
Pergunta: como tornar o campo read-only?
Dado: estou apenas customizando o admin do django e não tenho nenhum Form.

Encontrei a seguinte forma de fazer: http://www.djangosnippets.org/snippets/937/

No entanto, o campo no formulário fica assim:


Ou seja, ele imprime o nome do campo mas não o seu valor. Alguém tem uma solução?

abs
-- Victor Pantoja
http://victorpantoja.com

Diego Maia

unread,
Oct 5, 2009, 9:14:57 PM10/5/09
to django...@googlegroups.com
tenta isso aqui

identificador = models.CharField(max_length=12,default=strftime("%y%m%d%H%M%S"),unique=True,editable=False)

2009/10/5 Victor Pantoja <victor....@gmail.com>



--
Diego Cardoso Maia Santos
Programador

Victor Pantoja

unread,
Oct 5, 2009, 9:29:21 PM10/5/09
to django...@googlegroups.com
Oi Diego

Obrigado pela resposta! Havia tentando essa solução já. Só que, fazendo isso, o campo "identificador" simplesmente some do formulário (não consigo ver o valor dele).

abs

2009/10/5 Diego Maia <diegoc...@gmail.com>

Alexandre Martinazzo

unread,
Oct 5, 2009, 10:48:04 PM10/5/09
to django...@googlegroups.com
Olá, Victor.

Obrigado pela resposta! Havia tentando essa solução já. Só que, fazendo isso, o campo "identificador" simplesmente some do formulário (não consigo ver o valor dele).

Eu fiz uma brincadeirinha com o Django para campos read-only [1], veja se serve para você. Um campo como esse que você se referiu seria exibido usando a tag HTML label

Abraço,
Alexandre.

[1] - http://alemartinazzo.blogspot.com/2009/10/brincando-com-o-django.html

Samuel Santos

unread,
Oct 6, 2009, 7:57:34 AM10/6/09
to django...@googlegroups.com
uma maneira que conseguimos fazer foi

voce constroi um formulario que vai ser usado pelo admin

e neste formulario o campo respectivo ao seu atributo dos models
pode ser definido como algo assim:

campo = forms.CharField(widget=forms.Input(attrs={'readonly':'True'}))

acho que foi assim...

:D
falow aeh

2009/10/5 Alexandre Martinazzo <alexandre...@gmail.com>

Vinicius Mendes

unread,
Oct 6, 2009, 9:39:33 AM10/6/09
to django...@googlegroups.com
Definir o campo como readonly não vai impedir que um usuário mal intecionado edite o campo...

───────────────────
Vinícius Mendes
Engenheiro de Computação
http://meiocodigo.com


2009/10/6 Samuel Santos <arca...@gmail.com>

Samuel Santos

unread,
Oct 6, 2009, 10:31:20 AM10/6/09
to django...@googlegroups.com
mas aí ele editaria usando tipo ferramentas como firebug do firefox?... e alteraria via código?

2009/10/6 Vinicius Mendes <vbme...@gmail.com>

Vinicius Mendes

unread,
Oct 6, 2009, 10:57:40 AM10/6/09
to django...@googlegroups.com
Essa é só uma das possibilidades. Você não pode confiar a garantia da integridade dos seus dados em um código client side (HTML, Javascript, etc). O seu código server side deve ter capacidade de evitar que o campo seja editado. Se você se basear em client side, o cliente pode fazer uma requisição HTTP "na mão" e enviar os dados que quiser via POST. O que eu recomendo nesse caso de um campo ser readonly é colocar também no formulário algo no método clean que remova o campo do cleaned_data:

class Form(models.Form):
    def clean(self):
        cleaned_data = self.cleaned_data
        cleaned_data.pop('nome_do_campo', None)
        return cleaned_data

Dessa forma eu acredito que evite a alteração do campo. Não testei.

Vinicius Mendes

unread,
Oct 6, 2009, 11:00:55 AM10/6/09
to django...@googlegroups.com
Só complementando:

O ideal é criar um campo customizado que resolva esse problema de campos read only. Existem alguns snippets pra isso[1] e tem esse POST também [2].

[1] http://www.djangosnippets.org/snippets/1340/
[2] http://lazypython.blogspot.com/2008/12/building-read-only-field-in-django.html


───────────────────
Vinícius Mendes
Engenheiro de Computação
http://meiocodigo.com


2009/10/6 Vinicius Mendes <vbme...@gmail.com>

Samuel Santos

unread,
Oct 7, 2009, 1:40:47 PM10/7/09
to django...@googlegroups.com
hum muito boa a dica
valeu também :)

2009/10/6 Vinicius Mendes <vbme...@gmail.com>
Reply all
Reply to author
Forward
0 new messages