"장고 파일 올리기"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
 
21번째 줄: 21번째 줄:
 
         return self.title
 
         return self.title
 
</syntaxhighlight>파일을 정규표현식을 이용해 저장경로를 설정할 수 있다. 년월일로 저장하는 등 방식으로 저장하면 사람이 찾긴 힘들어지지만, 컴퓨터의 검색 속도는 더욱 빨라진다.
 
</syntaxhighlight>파일을 정규표현식을 이용해 저장경로를 설정할 수 있다. 년월일로 저장하는 등 방식으로 저장하면 사람이 찾긴 힘들어지지만, 컴퓨터의 검색 속도는 더욱 빨라진다.
 
객체가 지워질 때 올렸던 파일도 지워지게 하려면 file필드 안에 delete=True 옵션을 주면 된다.
 
  
 
=== save 오버라이드 ===
 
=== save 오버라이드 ===
35번째 줄: 33번째 줄:
 
             pass  # when new photo then we do nothing, normal case
 
             pass  # when new photo then we do nothing, normal case
 
         super(HomeworkAnswer, self).save(*args, **kwargs)
 
         super(HomeworkAnswer, self).save(*args, **kwargs)
 +
</syntaxhighlight>
 +
 +
=== 객체 삭제 전 file 삭제 ===
 +
기본적으로 객체를 지워도 파일 필드의 파일은 남는다. 지워줘야 맞지.<syntaxhighlight lang="python">
 +
from django.db.models.signals import pre_delete
 +
from django.dispatch import receiver
 +
...
 +
 +
@receiver(pre_delete, sender=HomeworkAnswer)
 +
def delete_homework_answer_file(sender, instance, **kwargs):
 +
    # 모델 인스턴스가 삭제되기 전에 파일을 삭제합니다.
 +
    if instance.file:
 +
        instance.file.delete(save=False)
 
</syntaxhighlight>
 
</syntaxhighlight>
 
== 폼 ==
 
== 폼 ==

2023년 10월 18일 (수) 17:43 기준 최신판

1 개요[편집 | 원본 편집]

파일 업로드 및 다운로드의 기능을 다룬다.

올려진 파일은 media 하위에 저장한다.

1.1 전제조건[편집 | 원본 편집]

  • 미디어 사용을 위한 URL경로와 디렉토리 지정. 다음 문서를 참고하자.
  • 확장 가능성 : django-storages 라이브러리를 사용하면, Amazon S3, Google Cloud Storage 등의 외부 스토리지에 저장 가능.

2 모델[편집 | 원본 편집]

from django.db import models

class FileUpload(models.Model):
    title = models.TextField(default=None)
    file = models.FileField('첨부 파일', upload_to='uploads/%Y/%m/%d')  # media 하위의 upload/ 하위에 년,월,일로 저장한다는 의미.

    def __str__(self):
        return self.title

파일을 정규표현식을 이용해 저장경로를 설정할 수 있다. 년월일로 저장하는 등 방식으로 저장하면 사람이 찾긴 힘들어지지만, 컴퓨터의 검색 속도는 더욱 빨라진다.

2.1 save 오버라이드[편집 | 원본 편집]

객체를 수정하여 새로 업로드 할 때 기존 파일을 지우지 않고 새 파일만 올리는 경우가 있다. 이런 경우 기존 파일은 그대로 남아 곤란한 찌꺼기가 된다.

    def save(self, *args, **kwargs):
        '''업로드 파일이 기존 파일과 다를 경우에 기존파일을 삭제하기 위한 save 오버라이드.'''
        try:
            this = HomeworkAnswer.objects.get(id=self.id)
            if this.file != self.file:
                this.file.delete(save=False)
        except:
            pass  # when new photo then we do nothing, normal case
        super(HomeworkAnswer, self).save(*args, **kwargs)

2.2 객체 삭제 전 file 삭제[편집 | 원본 편집]

기본적으로 객체를 지워도 파일 필드의 파일은 남는다. 지워줘야 맞지.

from django.db.models.signals import pre_delete
from django.dispatch import receiver
...

@receiver(pre_delete, sender=HomeworkAnswer)
def delete_homework_answer_file(sender, instance, **kwargs):
    # 모델 인스턴스가 삭제되기 전에 파일을 삭제합니다.
    if instance.file:
        instance.file.delete(save=False)

3[편집 | 원본 편집]

from djangoimport forms
from .models import FileUpload

class DocumentForm(forms.ModelForm)
    upload = forms.FileField(label='첨부 파일', required=False, 
          widget=forms.FileInput(attrs={'class': 'form'}))
    
    class Meta:
        model = Document
        exclude = ['attached']