1

私はここで非常に奇妙な問題の真っ只中にいます。

次のように宣言されたモデルにデフォルト値を持つ FileField があります。

class MyModel(models.Model):
    name = models.CharField(max_length=32)
    audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_ROOT, blank=True, null=False)

今、私が次のことをすると

>>> a = MyModel(name='Foo')
>>> a.save()
>>> a.audio_file.path
'/full/path/to/file'
>>> a.audio_file.url
'/full/path/to/file'   # again

MEDIA_ROOT と MEDIA_URL を次のように構成しました

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'static/')
MEDIA_URL = '/media/'

何か不足していますか?何かアドバイス?

前もって感謝します。

4

2 に答える 2

3

フルパスではなく、データベースに保存する実際の値 (文字列)をフィールドのデフォルト値に指定する必要があります。がその.urlように表示されているのはそのためです。あなたの場合は次のようになります:

audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_URL, blank=True, null=False)

defaultをデータベースに挿入すると、この問題が発生すると思います。

お役に立てれば!

于 2013-06-19T16:30:46.453 に答える
2

問題の原因である場合とそうでない場合があります。次のコードは、本番環境 (Django 1.5) で完全に機能しています。models.py:

...
    decision_file = models.FileField(
        upload_to = "guidance",
        blank = True,
        help_text = "20MB maximum file size."
    )
...

そして、私のベースsettings.pyでは:

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), '../../media')

MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(os.path.dirname(__file__), '../../static/')

STATIC_URL = '/static/'

静的ファイルとメディア ファイルに別々のパスと URL を定義していることに注意してください。% settings.MEDIA_ROOTデフォルトにフォーマット文字列を含めたり(Paulo Buの回答を参照)、パラメーターに末尾のスラッシュを使用したりするべきではないと思いますupload_to

要約すれば

  1. アップロード フォルダが存在することを確認します。
  2. 個別の静的およびメディア パスと URL を設定します。
  3. デフォルトからフォーマット文字列を削除します。と
  4. upload_toパラメータから末尾のスラッシュを削除します

作業コードが必要です。

于 2013-06-19T16:30:13.507 に答える