2011-08-09 13 views
0

管理者がzipファイルをアップロードできるようにするシステムを作成しようとしていますが、signalsを使用してスクリプトが自動的に解凍され、jpg,pngのすべてのファイルを検索します。 listを作成し、それに従ってデータベースレコードを生成します。モデルでDjangoファイルを解凍し、データベースに内容を追加します

、私はPhotoProjectMany-to-OneForeign Key別名関係にあり、ProjectPhotoテーブルを持っています。

以下のスクリプトは私が働いている信号です。私はエラーなしでinstance.file_zip.pathを得ることができ、スクリプトは手動で実行するとうまく動作します。

長時間のデバッグと私はbelongs_to=instanceに何か問題があると仮定しますが、実際にエラーが発生する理由を実際には理解していないため、修正方法はわかりません。 抽出部分がうまくいきました。参考のためにここに入れました。おそらく読んで理解する必要はありません。

@receiver(post_save, sender=Project) 
def unzip_and_process(sender, instance, **kwargs): 
    #project_zip = FieldFile.open(file_zip, mode='rb') 
    file_path = instance.file_zip.path 
    file_list = [] 
    with zipfile.ZipFile(file_path, 'r') as project_zip: 
     project_zip.extractall(re.search('[^\s]+(?=\.zip)', file_path).group(0)) 
     project_zip.close() 
    for root, dirs, files in os.walk(file_path): 
     for filename in files: 
      file_list.append(os.path.join(root, filename)) 
    photo_list = filter(filter_photos, file_list) 
    for photo in photo_list: 
     print 'Processing %s'%photo 
     p = Photo.objects.create(belongs_to=instance, img=photo, desc='Processed from zipfile') 
     p.save() 

更新

class Project(models.Model): 
    project_name=models.CharField(max_length=150) 
    date_taken=models.DateField() 
    date_deadline=models.DateField() 
    price=models.FloatField() 
    price_paid=models.BooleanField() 
    owner=models.ForeignKey(User) 
    file_zip=models.FileField(upload_to='projects/%Y/%m/%d') 

    def __unicode__(self): 
     return self.project_name 

    def file_path(self): 
     return re.search('[^\s]+(?=\.zip)', self.file_zip.name).group(0) 

class Photo(models.Model): 

    def project_path(instance, filename): 
     return '%s/%s'%(instance.belongs_to.file_path(),filename) 

    belongs_to=models.ForeignKey(Project, verbose_name="related_project") 
    img=models.ImageField(upload_to=project_path, max_length=255) 
    desc=models.CharField(max_length=255) 

    def __unicode__(self): 
     return '%s FROM [%s]'%(self.img.name,self.belongs_to) 
+0

あるエラーは何ですか? – Dominik

+0

あなたの投稿に誤りがあれば何でも追加してください。 'post_save'や' Project'のように、エラーに実際に関連する他のコードも追加してください。 – agf

+0

サイレントエラーを発生させる信号に接続されています。エラーは表示されませんが、データベースエントリは作成されませんが、抽出およびファイルリスト/フィルタリングが行われます。私はかなりProjectクラスは無関係だと確信していますが、私は2番目に追加します。 –

答えて

1
for root, dirs, files in os.walk(file_path): 

file_pathzipファイルを指します。 directory従ってos.walkは何も返さない

2

django-photologueはあなたが望むものを抽出し、zipfileをアップロードするための類似のハックを作成しました。

リンク:http://code.google.com/p/django-photologue/包みあなたは

EvenmoreをGoogleにしたくない、ジップアップロードクラスはGalleryUpload(models.Model)

+0

これは私が書こうとしたこととほぼ同じことです。さて、それをチェックして、私の要求を編集するほうがいいかもしれません。乾杯。 –

関連する問題