Django如何创建一个文件并将其保存到模型的FileField中?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (627)

下面是我的模型。我想要做的是生成一个新文件,并在保存模型实例时覆盖现有的文件:

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.Filedjango.core.files.base.ContentFile(见给出的链接手册的细节)。这两个选择归结为:

# Using File
f = open('/path/to/file')
self.license_file.save(new_name, File(f))
# Using ContentFile
self.license_file.save(new_name, ContentFile('A string with the file content'))
用户回答回答于
#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

Django 1.4.1

Python 2.7.3

扫码关注云+社区

领取腾讯云代金券