장고 - 파일을 만들고 모델의 파일 필드에 저장하는 방법은 무엇입니까?
여기 제 모델이 있습니다.모델 인스턴스가 저장될 때마다 새 파일을 생성하고 기존 파일을 덮어씁니다.
class Kitten(models.Model):
claw_size = ...
license_file = models.FileField(blank=True, upload_to='license')
def save(self, *args, **kwargs):
#Generate a new license file overwriting any previous version
#and update file path
self.license_file = ???
super(Request,self).save(*args, **kwargs)
파일을 업로드하는 방법에 대한 문서를 많이 봅니다.하지만 어떻게 하면 파일을 생성하고 모델 필드에 할당하여 Django가 올바른 위치에 저장할 수 있습니까?
Django 문서에서 FileField 및 FieldFile, 특히 FieldFile.save()를 확인하려고 합니다.
기본적으로, 필드는 다음과 같이 선언됩니다.FileField
액세스하면 클래스 인스턴스를 제공합니다.FieldFile
기본 파일과 상호 작용할 수 있는 여러 가지 방법을 제공합니다.따라서 다음과 같은 작업을 수행해야 합니다.
self.license_file.save(new_name, new_contents)
어디에new_name
할당하려는 파일 이름입니다.new_contents
파일의 내용입니다.참고:new_contents
다음 중 하나의 인스턴스여야 합니다.django.core.files.File
또는django.core.files.base.ContentFile
(자세한 내용은 매뉴얼 링크 참조).
두 가지 선택은 다음으로 요약됩니다.
from django.core.files.base import ContentFile, File
# Using File
with open('/path/to/file') as f:
self.license_file.save(new_name, File(f))
# Using ContentFile
self.license_file.save(new_name, ContentFile('A string with the file content'))
수락된 답변은 분명 좋은 해결책이지만 CSV를 생성하고 이를 제공하는 방법은 다음과 같습니다.
모든 바람직한 동작(기존 파일 덮어쓰기, 올바른 위치에 저장, 중복 파일 생성 등)을 얻는 데 약간의 시간이 걸렸기 때문에 이를 여기에 둘 가치가 있다고 생각했습니다.
장고 1.4.1
파이썬 2.7.3
#Model
class MonthEnd(models.Model):
report = models.FileField(db_index=True, upload_to='not_used')
import csv
from os.path import join
#build and store the file
def write_csv():
path = join(settings.MEDIA_ROOT, 'files', 'month_end', 'report.csv')
f = open(path, "w+b")
#wipe the existing content
f.truncate()
csv_writer = csv.writer(f)
csv_writer.writerow(('col1'))
for num in range(3):
csv_writer.writerow((num, ))
month_end_file = MonthEnd()
month_end_file.report.name = path
month_end_file.save()
from my_app.models import MonthEnd
#serve it up as a download
def get_report(request):
month_end = MonthEnd.objects.get(file_criteria=criteria)
response = HttpResponse(month_end.report, content_type='text/plain')
response['Content-Disposition'] = 'attachment; filename=report.csv'
return response
컨텍스트 관리자를 사용하거나 전화를 거는 것이 좋습니다.close()
파일 저장 과정에서 예외가 발생하는 경우.스토리지 백엔드가 다운된 경우 등에 발생할 수 있습니다.
모든 덮어쓰기 동작은 스토리지 백엔드에서 구성해야 합니다.예를 들어 S3Boto3Storage에는 설정이 있습니다.사용 중인 경우FileSystemStorage
사용자 정의 믹스인을 작성할 수 있습니다.
마지막으로 업데이트된 타임스탬프와 같은 사용자 정의 부작용을 발생시키려면 FileField의 저장 방법 대신 모델의 저장 방법을 호출하는 것이 좋습니다.이 경우 파일의 이름 속성을 파일 이름으로 설정할 수도 있습니다. 파일 이름은 에 상대적입니다.기본적으로 파일의 전체 경로로 설정되므로 파일을 설정하지 않으면 문제가 발생할 수 있습니다. 파일을 참조하십시오.__init__() 및 File.name .
다음은 예입니다.self
모델 인스턴스입니다.my_file
파일 필드 / 이미지 파일이며, 호출합니다.save()
전체 모델 인스턴스에서 FileField가 아닌 다음과 같은 기능을 제공합니다.
import os
from django.core.files import File
with open(filepath, 'rb') as fi:
self.my_file = File(fi, name=os.path.basename(fi.name))
self.save()
를 대로으안에서 이것을 으로.save()
오버로드했습니다.form_valid()
의CreateView
위해 ( 파일을 파일에 )FileField
).
에서 저는 아래제예를는서 Weasyprint를용하 에 저장하고 request_pdf
양식 제출 시 필드.
def form_valid(self, form):
html_template = get_template('request_pdf.html')
pdf_dict = {}
pdf_dict['something'] = form.instance.something
rendered_html = html_template.render(pdf_dict).encode(encoding="UTF-8")
base_url = self.request.build_absolute_uri("/")
pdf_file_bytes = HTML(string=rendered_html, base_url=base_url).write_pdf()
form.instance.request_pdf = ContentFile(pdf_file_bytes)
# We need to specify the filename, else the file won't be saved
form.instance.request_pdf.name = "my_filename"
return super(MyCreateView, self).form_valid(form)
언급URL : https://stackoverflow.com/questions/7514964/django-how-to-create-a-file-and-save-it-to-a-models-filefield
'programing' 카테고리의 다른 글
인쇄문의 출력을 캡처하는 테스트가 없습니다.어떻게 이것을 피할 수 있습니까? (0) | 2023.07.19 |
---|---|
Oracle이 이 쿼리에 대해 "ORA-00918: column undiously defined"를 제기하지 않는 이유는 무엇입니까? (0) | 2023.07.19 |
파이썬 요청을 사용하여 브라우저 방문을 위장하고 사용자 에이전트를 생성하는 방법은 무엇입니까? (0) | 2023.07.19 |
스프링 부트 : 요청 매개 변수의 사용자 지정 유효성 검사 (0) | 2023.07.19 |
Pandas 막대 그림에 값을 사용하여 막대 주석 달기 (0) | 2023.07.19 |