使用django-filer,我可以选择图像进入的文件夹,来自' Unsorted Uploads'

时间:2016-05-06 07:15:01

标签: python django django-filer

我第一次使用django-filer,它看起来很棒,而且工作得很好。

但我的所有图片都被上传到了“未排序的上传内容”。文件夹,我无法找到将它们放入特定文件夹的方法。这让我觉得它是一个基本功能,并且考虑到它允许你创建文件夹,这个必须是可能的,对吧?但是我无法在文档中找到它,快速查看源代码并没有帮助我。

我有一个基本的设置:

class Story(models.Model):
    image = FilerImageField()

class Gift(models.Model):
    # some stuff

class GiftImage(models.Model):
    gift = models.ForeignKey(Gift)
    image = FilerImageField()

我希望GiftImage.image和Story.image进入单独的文件夹,以便为管理员用户更轻松地进行排序/搜索。

我试过了

image = FilerImageField(upload_to='somewhere') # How a django ImageField would do it
image = FilerImageField(folder='somewhere') # a guess
image = FilerImageField(name='somewhere') # a guess
image = FilerImageField(folder_name='somewhere') # another guess

所有这些都给了我一个" TypeError: init ()得到了一个意外的关键字参数......"或者只是不做我希望做的事。

干杯!

2 个答案:

答案 0 :(得分:2)

如果有其他人遇到这个问题,我发现这是一个解决方法。如果你给这个字段一个默认值,那么上传将默认为默认图像所在的任何文件夹。在我的特定情况下,我想要一个默认图像,所以这就一举两得。

以下是如何做到这一点:

首先,请注意FilerImageField实际上是filer.Image的外键。因此,要添加默认值,您需要首先将filer.Image添加到数据库以用作默认值,将其放在要上载的文件夹中。你如何做到这一点取决于你 - 通过你的管理员,或者某种方式的数据迁移。然后,您可以使用方法将该图像设置为默认值,如下所示:

def get_default_image():
    from filer.models.imagemodels import Image
    try:
        return Image.objects.filter(name='My Default Image').order_by('-uploaded_at')[0]
    except IndexError:
        return None

class MyModel(models.Model):
    image = FilerImageField(null=True, blank=True, default=get_default_image)

这个实现有一些明显的警告。如果您的默认图像名称发生更改,您将返回到没有默认图像(并因此上传到“未排序的上传”)。如果有多个名称,您的方法必须选择一个。我选择了最近上传的一个。

如果您确信自己永远不想更改默认图片实例,只需按id选择即可。

所以这有点笨拙,但如果你想争取一些工作,也许你就可以了。希望这有助于某人。

答案 1 :(得分:0)

不可能以一种很好且受支持的方式AFAICT。

我正在使用一种变通方法,它依靠JS来更改URL。

templates/admin/<your_app>/<your_model>/change_form.html

{% extends "admin/change_form.html" %}

{% block extrahead %}
    {{ block.super }}
    <script>
        window.addEventListener('load', function() {
            const wrapper = document.querySelector('.js-filer-dropzone');
            const dropzone = wrapper.dropzone;
            const button = wrapper.querySelector('.js-related-lookup');
            button.href = button.href.replace('/last/', '/1/list/');
            dropzone.options.url = dropzone.options.url.replace('/no_folder/', '/1/');
        });
    </script>
{% endblock extrahead %}

1是目标文件夹的ID。问题是,当然,文件夹可以被删除,即使使用完全相同的名称重新创建,它们的ID也将不同。

如果页面上有多个字段,并且/或者如果它们是内联的一部分,则需要进行更多的调整。 YMMV。


另一种方法是覆盖filer/templates/admin/filer/widgets/admin_file.html并进行更改

{% url 'admin:filer-ajax_upload' %}

{% url 'admin:filer-ajax_upload' folder_id=1 %}