Eu não acho que você precise de ajuda para corrigir esse problema, tanto quanto você precisa de ajuda para depurá-lo. Uma vez que o problema está claro, a solução também parece clara. O Traceback talvez seja um pouco obscuro porque está passando por muito código-fonte do Django e não está dizendo qual de seus campos está tendo um problema.
Antecedentes deste problema
Para começar, estamos tendo problemas para salvar um
Post
instância. Bem, veja todos esses campos que você tem em sua definição de modelo: ...
url = models.URLField(max_length=250, blank=True, null=True)
video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True)
content = RichTextUploadingField(config_name='default')
image = models.ImageField(upload_to='images',blank=True, null=True)
thumbnail = models.ImageField(upload_to='images', blank=True, null=True)
Estes podem não parecer campos de texto, mas muitos deles são variações de campos de texto porque, se você pensar bem, provavelmente não armazenará arquivos inteiros em seu banco de dados. O que você fará em vez disso (e o que o Django faz por padrão) é armazenar o arquivo em algum lugar em algum disco e, em seguida, no banco de dados, você armazenaria o caminho para esse arquivo para que você possa recuperá-lo quando precisar.
Além disso, provavelmente é um desperdício armazenar caminhos de arquivo no banco de dados como
LongText
ou qualquer outra coisa, então cada FileField
temos significa que temos um campo com um max_length
se especificamos ou não. Assim, todos os campos acima têm um max_length
implícito . Você pode descobrir isso lendo o código fonte do Django. Exemplos de origem
Eu nunca usei
EmbedVideoField
, por exemplo, mas acaba sendo uma subclasse de models.URLField
, o que significa que tem um max_length
por padrão definido para 200 se você não especificar um. Além disso, seus vários
ImageField
s são apenas subclasses de FileField
, que tem um max_length
padrão de 100
. Como depurar problemas como esse no futuro?
Agora, isso não nos ajuda a saber qual dos seus campos está gerando um erro neste caso. Para isso, eu provavelmente definiria um ponto de interrupção em algum lugar do código, provavelmente aqui:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
Por "definir um ponto de interrupção", quero dizer o seguinte:
Vá para a linha 65 no módulo mencionado acima,
ebagu/main/models.py
e digite o seguinte e salve o módulo:import pdb; pdb.set_trace()
(Na verdade, tenho uma forte preferência por ipdb eu mesmo, mas isso requer o Ipython, pelo qual também tenho uma forte preferência ...)
Execute seu servidor local e execute as etapas que produziram esse problema. Você acabará enviando seu formulário e se você olhar para o console onde você iniciou seu servidor, você eventualmente será despejado em um shell na linha 65. Este shell é um pdb shell , que tem regras diferentes de um shell normal, mas você pode avaliar seu
Post
prestes a ser salvo instância, observando os vários campos na própria instância, self
, e executando o código Python no contexto dessa chamada de método:(pdb) len(self.image.path)
Usando isso, eu avaliaria manualmente os vários campos e veria qual deles tem essa entrada realmente longa que está sufocando o salvamento (provavelmente um de seus
ImageField
s). Solução com avisos
Como alternativa, você pode simplesmente adicionar um
max_length
a todos eles, mas esteja avisado de que você provavelmente precisará realizar migrações de banco de dados para qualquer campo de texto limitado, você altera porque seu banco de dados ainda verificará o comprimento da entrada em relação a como a coluna está definida. Aqui está uma boa resposta do StackOverflow analisando exatamente esse problema
. Nota de rodapé
Por que isso não surgiu antes de você mudar para o Postgresql? Há uma variedade de razões potenciais, mas provavelmente tem a ver com como o banco de dados anterior foi configurado versus como o banco de dados Postgresql foi configurado (manualmente versus migrações do Django?).
Também pode ter a ver com se você mudou ou não onde essas coisas estão sendo armazenadas. Você alterou sua
MEDIA
configurações para que os caminhos onde os arquivos são armazenados fiquem muito mais longos? O que você realmente deve fazer é olhar diretamente para o seu banco de dados. Abra um
psql
instância e peça para descrever suas tabelas para você. Ele lhe dirá quais campos estão limitados a 100 caracteres e esses são os campos que estão causando problemas.