0

upload_toManyToMany フィールドのスラッグから ImageField の値を設定しようとしています。

これが私のモデルです:

def get_image_path(instance, filename):
    return os.path.join('gallery', str(instance.albums.all()[0]), filename)

class Image(models.Model):
    ...
    image = models.ImageField(upload_to=get_image_path)
    ...

残念ながら、うまくいきません。Image オブジェクトを保存しようとすると、エラーが発生します。

多対多の関係を使用するには、「イメージ」インスタンスに主キーの値が必要です。

それを行う正しい方法はありますか?

助けてくれてありがとう!

4

1 に答える 1

2

アクセスする前にinstance、 のインスタンスであるImage()、および との M2M 関係を保存する必要があります。albumsinstance.albums.all()

で使用する前に、現在のモデル ID を使用した Django 管理ファイルのアップロードを確認して、保存のポイントを確認してください。ここでは M2M が邪魔になるので、投稿で言及されている方法の代わりに、シグナルを使用して の準備完了を通知します。たとえば、次のようになります。Modelpkupload_to()post_save()m2m_changedinstance.albums.all()

@receiver(m2m_changed, sender=Image.albums.through)
def save_file_on_m2m(sender, instance, action, **kwargs):
    if action == 'post_add' and hasattr(instance, _UNSAVED_FILEFIELD):
        instance.image = getattr(instance, _UNSAVED_FILEFIELD)
        instance.save()        
        instance.__dict__.pop(_UNSAVED_FILEFIELD)

これは の m2m 値に依存し、Image.albums存在しない場合はimage失われます。したがって、これよりもしっかりした他のキーを使用することをお勧めします。

また、モデルフォーム自体と M2M リレーションimageを保存した後、手動でフィールドを保存するためにモデルフォームで直接作業することもできます。Image()

于 2012-06-26T15:43:37.273 に答える