django-filebrowser - 如何自动为图像创建丢失的文件夹?

时间:2014-03-15 23:28:20

标签: django browser directory file-management

我正在使用python 3.3和django 1.6并使用django-filebrowser。

我想根据模型类中的描述自动创建任何缺少的文件夹。例如,如果模型说明了这一点:

class Marketing(models.Model):
    marketing_title = models.CharField(max_length=20)
    marketing_image = FileBrowseField("Image", max_length=200, directory="/frontpage/marketing", blank=True, null=True)

    def __str__(self):

我希望在frontpage/marketing文件夹中创建名为media/uploads的文件夹结构。然后,当我的用户去管理员并添加图片时,搜索图标应自动打开到正确的目录进行上传。

目前,当我点击搜索图标时,它只会转到基目录media/uploads

1 个答案:

答案 0 :(得分:0)

我使用Grappelli,TinyMCE V3和FileBrowser的项目遇到了这个问题:

https://groups.google.com/d/msg/django-grappelli/kvZG9nD9OpM/bsuROsYjEQAJ

我通过在模型的SAVE函数中添加代码来解决它,以便在用户保存记录时创建所需的文件夹。

import os
from django.conf import settings

class Job(models.Model):
    def save(self, *args, **kwargs):
        job_path = os.path.join(settings.MEDIA_ROOT, settings.FILEBROWSER_DIRECTORY, self.number)
        try:
            logger.debug("Trying to create folder %s", job_path)
            os.makedirs(job_path)
            logger.debug('---    Job Folder created!       ---')
        except OSError:
            if not os.path.isdir(job_path):
                logger.debug('---    Job Folder creation error!  ---')
                raise
            else:
                logger.debug('---    Job Folder already exists!  ---')
        # Call 'real' save method:
        super(Job, self).save(*args, **kwargs) # Call the "real" save() method.

这将在服务器上使用绝对路径构建目标文件夹名称。然后它创建文件夹,如果它不存在。有很多“讨论”是否 Cricket 使用OSError检测文件夹是否已存在。如果您在辩论的“其他”方面,请首先使用 isdir()来使用 IF 语句。

下一部分是对自定义 filebrowse 功能开始的更改:

function CustomFileBrowser(field_name, url, type, win) {
  var cmsURL = '/admin/filebrowser/browse/?pop=2';
  var mypath = mypath = django.jQuery('#id_number').attr('value');
  console.log("mypath using #id: " + mypath);
  if (!mypath) {
    mypath = django.jQuery('div.grp-readonly')[0].innerHTML;
    console.log("mypath readonly: " + mypath);
  }
  cmsURL = cmsURL + '&type=' + type;
  cmsURL = cmsURL + '&dir=' + mypath;
  console.log(cmsURL);

  tinyMCE.activeEditor.windowManager.open({ })
    ... rest of function ...
}

由于我的表单对于低级别用户具有只读模式,因此保存文件夹名称的字段可以显示为“输入”字段,也可以显示为只读DIV文本。第一次定义mypath的尝试适用于输入字段。 IF检测是否失败(mypath将为NULL)并尝试从HTML文本中抓取它。我对我的DIV选择器不满意,如果字段的顺序发生变化,它可能会开始抓错了。但它现在会做。在(希望)找到正确的文件夹名称之后,我将其作为'& dir = folder'附加到FileBrowser URL。这是利用FileBrowser在调用URL中查找“dir”值的事实。如果找到,它会在打开浏览器之前尝试CD。非常便利。不确定它的记录,我在阅读FileBrowser的源代码时找到了它。

如果FileBrowser无法将CD放入该文件夹,则会显示漂亮的粉红色错误消息。我已培训员工“修复”,通过退出文件浏览器和图像插入器对话框,按SAVE AND CONTINUE - 创建文件夹 - 然后重试。

希望这有助于其他人!