我如何以及在哪里处理来自django admin的文件上传?

时间:2013-07-01 06:41:33

标签: django

所以我阅读了文档,我有点困惑。我有一个这样的模型

class Image(models.Model):
name = models.CharField(max_length=80)
file = models.ImageField(upload_to = 'project_images')
description = models.CharField(max_length=30)

def __unicode__(self):
    return self.name

文件上传的处理是通过管理界面完成的,管理界面有效但我需要根据提交上传时存在的其他字段对数据做更多的事情。

基本上当前目录是project_images我想要做的是保存图像时必须放在---&gt; project_images/<year>/<month>。保存的文件路径在保存在数据库中时必须反映这一点,文件名也必须保存在名称字段中。

我理解这背后的逻辑;

  1. 检查帖子
  2. 检查有效(我已假设ImageField负责这一点)
  3. 获取文件名
  4. 获取年月(数字)
  5. 检查目录是否存在
  6. 如果目录不存在,请创建它,如果他们确实使用它们
  7. 将名称设置为文件名
  8. 上传并保存所有
  9. 我应该在哪里指明这个?在保存方法下的模型中?

    很抱歉,如果在文档中指定了这个,但这是文档的一个区域,这让我很困惑。

    由于

2 个答案:

答案 0 :(得分:1)

from django.db import models
import datetime
import os
import uuid
# Create your models here.
def get_file_path(instance,filename):
        ext=filename.split('.')[-1]
        filename="%s.%s" % (uuid.uuid4(),ext)
        return os.path.join(instance.directory_string_var,filename)

class Image(models.Model):
        file=models.ImageField(upload_to=get_file_path)

        now=datetime.datetime.now()
        directory_string_var = 'image/%s/%s/%s/'%(now.year,now.month,now.day)

将您的模型更改为高于一。

这会在媒体/年/月/日文件夹中使用随机名称保存文件。

如果你不希望文件名是随机的,只需注释掉

ext = filename.split('.')[-1] #and 
filename="%s.%s" % (uuid.uuid4(),ext)

答案 1 :(得分:0)

检查一下:

how to create year/month/day structure when uploading files with django

所以在你的模型中,你可以这样做:

class Image(models.Model):
    name = models.CharField(max_length=80)
    file = models.ImageField(upload_to = 'project_images/%Y/%m')
    description = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

upload_to的'%Y /%m'部分是strftime格式; '%Y'是四位数年份,'%m'是两位数月份

您必须将其检查为:

http://scottbarnham.com/blog/2007/07/31/uploading-images-to-a-dynamic-path-with-django/

我希望这有帮助