Formatar data recebida

551 views
Skip to first unread message

Guevara

unread,
Aug 25, 2011, 7:52:18 PM8/25/11
to Django Brasil
Oi pessoal!
Tenho a seguinte data/hora sendo recebida via POST:

25/08/2011 20:44:29

Meu formats.py está assim:

DATE_INPUT_FORMATS = ('%d-%m-%Y','%Y/%m/%d %H:%M:%S',)

No model tenho o atributo:

data_transacao = models.DateTimeField()

O erro é:

[u'Informe uma data/hora v\xe1lida no formato YYYY-MM-DD
HH:MM[:ss[.uuuuuu]].']

Segui as dicas da doc:
https://docs.djangoproject.com/en/1.3/ref/forms/fields/#django.forms.DateTimeField

Não deveria aceitar a data recebida já que está formatada no
formats.py?
Abraço!

Guevara

unread,
Aug 25, 2011, 9:03:28 PM8/25/11
to Django Brasil
Bom, o campo é gerado desta forma:

'DataTransacao': datetime.now().strftime('%d/%m/%Y %H:%M:%S'),

Coloquei no formats.py:

DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M:%S',)

O erro continua sendo:

[u'Informe uma data/hora v\xe1lida no formato YYYY-MM-DD
HH:MM[:ss[.uuuuuu]].']

Mas que diacho... ¬¬

On 25 ago, 20:52, Guevara <eguevara2...@gmail.com> wrote:
> Oi pessoal!
> Tenho a seguinte data/hora sendo recebida via POST:
>
> 25/08/2011 20:44:29
>
> Meu formats.py está assim:
>
> DATE_INPUT_FORMATS = ('%d-%m-%Y','%Y/%m/%d %H:%M:%S',)
>
> No model tenho o atributo:
>
> data_transacao = models.DateTimeField()
>
> O erro é:
>
> [u'Informe uma data/hora v\xe1lida no formato YYYY-MM-DD
> HH:MM[:ss[.uuuuuu]].']
>
> Segui as dicas da doc:https://docs.djangoproject.com/en/1.3/ref/forms/fields/#django.forms....

Moreno Cunha

unread,
Aug 25, 2011, 9:34:47 PM8/25/11
to django...@googlegroups.com
Guevara,

precisei modificar o formato da data em um form e usei assim:

data_nascimento=forms.DateField(('%d/%m/%Y',), label=_(u'Data de nascimento'), required=False, widget=forms.DateTimeInput(format='%d/%m/%Y'),help_text=_(u'Formato dd/mm/aaaa'))


Moreno Pinheiro
Developer

contato={ 
          'Blog' : 'EasyDjango',
          'Twitter' : '@morenocunha',
          'Skype' : 'moreno.pinheiro',
          'tel' :  '+55 27 9834-6305' 
         }



--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>

Guevara

unread,
Aug 25, 2011, 9:49:52 PM8/25/11
to Django Brasil
Obrigado pela dica Moreno Cunha, mas a data é gerada pelo server de
testes do pagseguro, então vêm direto via POST. Removi a formatação da
data no server:

.strftime('%Y/%m/%d %H:%M:%S')

Sem isso ele gera a data normalmente e consigo inserir no banco. O
problema é se o pagseguro envia a data com um simples datetime.now()
ou se coloca essa formatação na sequência. =/
Vou ver com eles isso pra ter certeza que a data virá como esperado.
Quando tiver a resposta, eu volto pra postar.
Mais uma vez, obrigado pela atenção.
Abraço!

On 25 ago, 22:34, Moreno Cunha <mp3cu...@gmail.com> wrote:
> Guevara,
>
> precisei modificar o formato da data em um form e usei assim:
>
> data_nascimento=forms.DateField(('%d/%m/%Y',), label=_(u'Data de
> nascimento'), required=False,
> widget=forms.DateTimeInput(format='%d/%m/%Y'),help_text=_(u'Formato
> dd/mm/aaaa'))
>
> fonte:http://faces.eti.br/2009/02/18/fixing-date-input-in-django/
>
> Moreno Pinheiro <http://www.morenopc.com>
> Developer
>
> contato={
>           'Blog' : 'EasyDjango <http://www.easydjango.net>',
>           'Twitter' : '@morenocunha <http://twitter.com/morenocunha>',
>           'Skype' : 'moreno.pinheiro <http://www.morenopc.com/>',

Ernesto Guevara

unread,
Aug 26, 2011, 4:38:07 PM8/26/11
to Django Brasil
Têm como pré-formatar o timestamp a ser criado pelo DateTimeField() no banco?
Percebi que o timestamp gerado no postgre é este:

2011-08-25 22:13:32.726675-03

Precisaria de um timestamp no mesmo formato que está vindo do server do pagseguro:

26/08/2011 17:24:27

O estranho é que na doc, este formato consta como suportado:
https://docs.djangoproject.com/en/dev/ref/settings/?from=olddocs#datetime-format

Mas ele cria daquele jeito completo.
Precisa passar algum parâmetro no models.DateTimeField() ?
Abraço!

marcos thomaz

unread,
Aug 27, 2011, 1:37:59 PM8/27/11
to django...@googlegroups.com
Olá, 

adicione no settings.py:
DATE_INPUT_FORMATS = ('d/%m/%Y',)
DATETIME_INPUT_FORMATS = ('d/%m/%Y %H:%M','d/%m/%Y %H:%M:%S')

Para usar o formats, crie um diretório com o nome formats. Dentro dele, crie um arquivo vazio __init__.py. Depois, dentro do diretório formats, crie um diretório com a especificação do idioma (se estiver usando o padrão, o diretório é en, se mudou o language para "pt-br", o diretório é pt). Dentro dele crie dois arquivos, um sendo um arquivo vazio, __init__.py e o outro o arquivo formats.py. Feito isso, no settings, adicione:

FORMAT_MODULE_PATH = 'seuProjeto.formats'

Os formats funcionarão. O que fará parar de dar erro nas datas é o DATE_INPUT_FORMATS do settings. Isso irá resolver o problema da validação, porém, a apresentaçãoo inicial das datas ainda será no formato antigo ( Y-m-d ). No admin, eu uso uma classe ModelAdminBase, criada estendendo de admin.ModelAdmin, que sobrescreve o método chamado formfield_db_dbfield, onde verifico o tipo do objeto e se for datefield, ou datetimefield, altero as configurações do widget (uso um Widget proprio, mas simplesmente alterando o input_formats do widget já resolve).

[]'s

Marcos Thomaz

De: Ernesto Guevara <egueva...@gmail.com>
Para: Django Brasil <django...@googlegroups.com>
Enviadas: Sexta-feira, 26 de Agosto de 2011 17:38
Assunto: Re: Formatar data recebida

Ernesto Guevara

unread,
Aug 28, 2011, 12:27:52 PM8/28/11
to django...@googlegroups.com
Olá Marcos!
Eu já tinha o formats.py com essas configurações, mas elas só têm efeito quando são inseridas pela própria aplicação através dos forms. No meu caso a data vêm de outro server via POST, e ai o formats.py não funciona.
Peguei uma linha de código no canal do django para transformar essa String de data do pagseguro num DateTime  e ai sim gravar no banco.
Infelizmente a api do pagseguro é muito fraca, ao invés de facilitar, eles complicam mais.
Não existe exemplo de retorno automático para Python e o de Java é em Scriptlet, ou seja, algo que era usado na década de 90 e que está condenado atualmente.
Se supõe que ajudar os devs na integração com o pagseguro, seria vantajoso para eles, mas parece que eles não pensam assim. O fórum iMasters, que é o fórum oficial para tirar dúvidas com o pagseguro está morto, ninguém responde mais.
[]s

marcos thomaz

unread,
Aug 28, 2011, 4:49:41 PM8/28/11
to django...@googlegroups.com
Entendo Ernesto, mas  voltando o foco a seu sistema, se os dados vêm via POST, dá pra pegar e alterá-los, convertendo para o datetime, para isso, bastaria apenas saber o formato com o qual eles enviam. A conversão é simples. Eu não havia prestado atenção na situação que você citou (os dados virem de outro servidor), mas tipo, é algo relativamente simples de resolver. 
 
[]'s

Marcos Thomaz

De: Ernesto Guevara <egueva...@gmail.com>
Para: django...@googlegroups.com
Enviadas: Domingo, 28 de Agosto de 2011 13:27
Reply all
Reply to author
Forward
0 new messages