この問題を修正するのに助けが必要なのと同じくらい、この問題を修正するのに助けが必要だとは思いません。問題が明確になると、解決策も明確になります。トレースバックは、Djangoのソースコードを大量に処理していて、どのフィールドに問題があるのかがわからないため、おそらく少し不明確です。
この問題の背景
まず、Post
の保存に問題があります 実例。モデル定義にあるこれらすべてのフィールドを見てください:
...
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)
これらは次のように見えない テキストフィールドですが、それらの多くはテキストフィールドのバリエーションです。これは、考えてみると、おそらくファイル全体を保存することはないためです。 データベース内。代わりに行うこと(およびDjangoがデフォルトで行うこと)は、ファイルをディスクのどこかに保存してから、データベースにパスを保存することです。 そのファイルに追加して、必要なときに取得できるようにします。
さらに、ファイルパスをLongText
としてデータベースに保存するのはおそらく無駄です。 または何でも、すべてのFileField
max_length
のフィールドがあることを意味します 指定するかどうか。したがって、上記のすべてのフィールドには、暗黙のmax_length
があります。 。これは、Djangoのソースコードを読むことで実際に見つけることができます。
ソースの例
EmbedVideoField
を使用したことはありません 、たとえば、 models.URLField
のサブクラス
、つまりmax_length
デフォルトでは、200に設定されています 指定しない場合。
さらに、さまざまなImageField
sはFileField
の単なるサブクラスです 、 max_length
デフォルトは100
。
将来このような問題をデバッグする方法
さて、これは私たちがどのを知るのに役立ちません この場合、フィールドの一部がエラーをスローしています。そのために、おそらくコードのどこかにブレークポイントを設定します。おそらくここにあります:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
「ブレークポイントを設定する」とは、次のことを意味します。
上記のモジュールの65行目ebagu/main/models.py
に移動します。 次のように入力して、モジュールを保存します。import pdb; pdb.set_trace()
(私は実際、ipdb> 私自身ですが、それにはIpythonが必要です。これも私が強く望んでいます...)
ローカルサーバーを実行し、この問題が発生した手順を実行します。最終的にフォームを送信し、サーバーを起動したコンソールを見ると、最終的に65行目でシェルにダンプされます。このシェルはpdbシェル
、通常のシェルとはルールが異なりますが、保存しようとしているPost
を評価できます。 インスタンス、インスタンス自体のさまざまなフィールドを確認することにより、self
、およびそのメソッド呼び出しのコンテキストでPythonコードを実行する:
(pdb) len(self.image.path)
それを使用して、さまざまなフィールドを手動で評価し、保存を妨げているこの非常に長いエントリ(おそらくImageField
の1つ)を持っているフィールドを調べます。 s)。
警告付きの解決策
または、max_length
を追加することもできます これらすべてに適用されますが、データベースの移行を実行する必要がある可能性が高いことに注意してください。 データベースが入力の長さを列の定義方法と照合するため、変更する限られたテキストフィールドに対して。 これがまさにこの問題を調べたStackOverflowの良い答えです
。
脚注
Postgresqlに切り替える前にこれが発生しなかったのはなぜですか?考えられる理由はさまざまですが、おそらく以前のデータベースの設定方法とPostgresqlデータベースの設定方法(手動での移行とDjangoの移行)に関係しています。
また、これらのものが保存されている場所を変更したかどうかにも関係している可能性があります。 MEDIA
を変更しましたか ファイルが保存されるパスが大幅に長くなるように設定しますか?
あなたが本当にすべきことはあなたのデータベースを直接見ることです。 psql
を開きます インスタンスを作成し、テーブルについて説明するように依頼します。どのフィールドが100文字に制限されているかがわかり、それらが問題を引き起こすフィールドです。