2011-06-29 11 views
0

Fieldオブジェクトの変数に値を代入すると、ModelFormがリロードされてデフォルトに再割り当てされないのはなぜですか?Django - Modelフィールドは同じ値を保持します!

ファイル

class CustomFile(ImageFile, FieldFile): 
    def save(self, name, content, save = True): 
     if self.field.override_name: 
      self(CustomFile, self).save(self.field.override_name, content, save = save) 
     else: 
      self(CustomFile, self).save(generate_name(self.instance, name), content, save = save) 

フィールド

class CustomImageField(ImageField): 
    attr_class = CustomFile 
    def __init__(self, overrided_name, *args, **kwargs): 
     self.overrided_name = overrided_name 
     super(CustomImageField, self).__init__(*args, **kwargs) 

モデル

class Test(models.Model): 
    email = models.EmailField() 
    file = CustomImageField() 

AdminForm

class TestForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(TestForm, self).__init__(*args, **kwargs) 
     self.old_instance = self.instance 

管理

class TestAdmin(Test): 
    form = TestForm 

    def save_model(self, request, obj, form, change): 
     if form.old_instance: 
      form.old_instance.file.delete(save = True) 
      form.old_instance.file.field.override_name = form.old_instance.name 
     obj.save() 

admin.site.register(Test, TestAdmin) 

私の問題は、私は、サーバーを再起動するまで、私がアップロードするすべての画像は、同じ名前を持つことになります!.. オブジェクトが変更されないのはなぜ?特にFieldオブジェクト...トレースすると同じオブジェクトになります。

私はそうのようにそれを解決してきました:

class CustomFile(ImageFile, FieldFile): 
    def save(self, name, content, save = True): 
     if self.field.override_name: 
      self(CustomFile, self).save(self.field.override_name, content, save = save) 
      self.field.override_name = None 
     else: 
      self(CustomFile, self).save(generate_name(self.instance, name), content, save = save) 

私はDjangoの1.2.6、Pythonの2.6とWindowsを使用しています!

+1

なぜカスタムフィールドタイプを作成していますか?あなたはちょうどDjangoのImageField型を使用することはできませんでしたか? –

+0

残念ながら、私は画像、親指、オリジナルを保存しなければなりません(動的生成サム、透かしなど)...この部分は動作します...なぜ私の問題はdjango-adminフォームが同じフィールドオブジェクトを再利用するのですか?それとももっとうまくいったのですか?... – StefanNch

答えて

1

私はちょうど推測していますが、この部分は間違っていませんか?

form = TestForm 

クラスを参照するのではなく、インスタンスを作成すべきですか?

form = TestForm() 

ここですか?

attr_class = CustomFile - > attr_class = CustomFile() 
+0

うーん...いいえ!.. Djangoは参照クラスを使って後で呼び出す...あなた自身のCustomFields/CustomFilesを書くことができます。 FileDescriptorクラスはhttps://code.djangoproject.com/browser/django/trunk/django/db/models/fields/files.pyで確認してください。とにかく、私はこれがなぜ起こっているのかを知っていると信じています:Djangoは、FileFieldインスタンスと複数のFieldFileインスタンスだけを使用します。それはちょっとラッパーのように振る舞う...私はそれを解決した、と思うが、私は一貫した答えを書く時間がなかった! – StefanNch

関連する問題