python - دجانجو-كيفية إنشاء ملف وحفظه في FileField للنموذج؟




django django-models (4)

هنا طرازي. ما أريد فعله هو إنشاء ملف جديد والكتابة فوق الملف الحالي عند حفظ مثيل نموذج:

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)

أرى الكثير من الوثائق حول كيفية تحميل ملف. ولكن كيف يمكنني إنشاء ملف وتعيينه إلى حقل نموذجي وتخزينه في المكان المناسب؟


Answers

الإجابة المقبولة هي بالتأكيد حل جيد ، ولكن هنا الطريقة التي اتبعتها في إنشاء ملف CSV وخدمته من العرض.

#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

أعتقد أنه كان من المفيد وضع هذا هنا حيث أخذني قليلاً من العبث للحصول على كل السلوك المرغوب (الكتابة فوق الملف الموجود ، التخزين إلى المكان الصحيح ، عدم إنشاء ملفات مكررة ، إلخ).

دجانجو 1.4.1

Python 2.7.3


تريد إلقاء نظرة على FileField و FieldFile في مستندات Django ، وخاصة FieldFile.save() .

بشكل أساسي ، يمنحك الحقل الذي تم تعريفه كـ FileField ، عند الوصول إليه ، FieldFile من Class FieldFile ، والذي يمنحك عدة طرق للتفاعل مع الملف الأساسي. لذلك ، ما عليك القيام به هو:

self.license_file.save(new_name, new_contents)

حيث new_name هو اسم الملف الذي تريد تعيينه و new_contents هو محتوى الملف. لاحظ أن new_contents يجب أن يكون مثالاً إما django.core.files.File أو django.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'))

شكراtawmas. بالإضافة إلى ذلك،

تلقيت خطأً إذا لم أحدد وضع الملف أثناء فتح الملف. وبالتالي،

f = open('/path/to/file', 'r')

بالنسبة إلى نوع ملف ZIP ،

f = open('/path/to/file.zip', 'rb')

باستخدام المولدات

# python 2.x
import scandir
import sys

de = scandir.scandir(sys.argv[1])
while 1:
    try:
        d = de.next()
        print d.path
    except StopIteration as _:
        break




python django django-models