私が理解しているように、あなたの問題はこのファイルを動的に生成する方法ではなく、人々がダウンロードするためのリンクを作成することです...
私が提案するのは次のとおりです。
0) ファイルのモデルを作成します。動的に生成する場合は、FileField を使用せず、このファイルの生成に必要な情報のみを使用します。
class ZipStored(models.Model):
zip = FileField(upload_to="/choose/a/path/")
1) Zip を作成して保存します。この手順は重要です。zip をメモリ内に作成し、それをキャストして FileField に割り当てます。
function create_my_zip(request, [...]):
[...]
# This is a in-memory file
file_like = StringIO.StringIO()
# Create your zip, do all your stuff
zf = zipfile.ZipFile(file_like, mode='w')
[...]
# Your zip is saved in this "file"
zf.close()
file_like.seek(0)
# To store it we can use a InMemoryUploadedFile
inMemory = InMemoryUploadedFile(file_like, None, "my_zip_%s" % filename, 'application/zip', file_like.len, None)
zip = ZipStored(zip=inMemory)
# Your zip will be stored!
zip.save()
# Notify the user the zip was created or whatever
[...]
2)URLを作成します。たとえば、IDに一致する番号を取得します。スラッグフィールド(this)も使用できます
url(r'^get_my_zip/(\d+)$', "zippyApp.views.get_zip")
3) ビュー、このビューは、URL で渡された ID に一致するファイルを返します。ID の代わりにテキストを送信するスラッグを使用して、slugfield による取得フィルタリングを行うこともできます。
function get_zip(request, id):
myzip = ZipStored.object.get(pk = id)
filename = myzip.zip.name.split('/')[-1]
# You got the zip! Now, return it!
response = HttpResponse(myzip.file, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=%s' % filename