"장고 파일 올리기"의 두 판 사이의 차이
둘러보기로 가기
검색하러 가기
(새 문서: == 개요 == 파일 업로드 및 다운로드의 기능을 다룬다. 올려진 파일은 media 하위에 저장한다. === 전제조건 === * 미디어 사용을 위한 URL경로...) |
(→모델) |
||
22번째 줄: | 22번째 줄: | ||
</syntaxhighlight>파일을 정규표현식을 이용해 저장경로를 설정할 수 있다. 년월일로 저장하는 등 방식으로 저장하면 사람이 찾긴 힘들어지지만, 컴퓨터의 검색 속도는 더욱 빨라진다. | </syntaxhighlight>파일을 정규표현식을 이용해 저장경로를 설정할 수 있다. 년월일로 저장하는 등 방식으로 저장하면 사람이 찾긴 힘들어지지만, 컴퓨터의 검색 속도는 더욱 빨라진다. | ||
+ | 객체가 지워질 때 올렸던 파일도 지워지게 하려면 file필드 안에 delete=True 옵션을 주면 된다. | ||
+ | |||
+ | === save 오버라이드 === | ||
+ | 객체를 수정하여 새로 업로드 할 때 기존 파일을 지우지 않고 새 파일만 올리는 경우가 있다. 이런 경우 기존 파일은 그대로 남아 곤란한 찌꺼기가 된다.<syntaxhighlight lang="python"> | ||
+ | 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) | ||
+ | </syntaxhighlight> | ||
== 폼 == | == 폼 == | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> |
2023년 10월 18일 (수) 17:20 판
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
파일을 정규표현식을 이용해 저장경로를 설정할 수 있다. 년월일로 저장하는 등 방식으로 저장하면 사람이 찾긴 힘들어지지만, 컴퓨터의 검색 속도는 더욱 빨라진다.
객체가 지워질 때 올렸던 파일도 지워지게 하려면 file필드 안에 delete=True 옵션을 주면 된다.
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)
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']