3

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

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我想要做的是保存图像时必须放置在 --->project_images/<year>/<month>中。当保存在数据库中时,保存的文件路径必须反映这一点,并且文件名也必须保存在名称字段中。

我理解这样做背后的逻辑;

  1. 检查帖子
  2. 检查有效(我假设 ImageField 已经解决了这个问题)
  3. 获取文件名
  4. 获取年份和月份(数字)
  5. 检查目录是否存在
  6. 如果目录不存在,则创建它,如果它们确实使用它们
  7. 将名称设置为文件名
  8. 全部上传并保存

我应该在哪里指定这个?在model下有个save方法?

抱歉,如果这是在文档中指定的,但这是文档中让我感到困惑的一个领域。

谢谢

4

2 回答 2

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)

将您的模型更改为上述模型。

这会将您的文件以随机名称保存在文件夹 media/year/month/day 中。

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

ext = filename.split('.')[-1] #and 
filename="%s.%s" % (uuid.uuid4(),ext)
于 2013-07-01T07:25:56.810 回答
0

检查这个:

使用 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/

我希望这有帮助

于 2013-07-01T07:16:53.757 回答