【问题标题】:Using django-filer, can I chose the folder that images go into, from 'Unsorted Uploads'使用 django-filer,我可以从“未排序的上传”中选择图像进入的文件夹吗
【发布时间】:2016-05-06 07:15:01
【问题描述】:

我是第一次使用 django-filer,它看起来很棒,而且运行良好。

但是我所有的图片都被上传到“Unsorted Uploads”文件夹中,我想不出一种方法来把它们放在一个特定的文件夹中。这是一个让我印象深刻的基本功能,鉴于它允许您创建文件夹,这必须是可能的,对吧?但我在文档中找不到它,快速浏览源代码对我没有帮助。

我有一个基本设置,例如:

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() got an unexpected keyword argument ...”,要么就是不做我希望的事。

干杯!

【问题讨论】:

  • 你有没有想过这个问题?我现在在同一条船上。这似乎是一个显而易见的基本需求,我不敢相信没有办法做到这一点。
  • 对不起,我已经有一段时间没有从事那个项目了,但我想我从来没有弄清楚:(
  • 谢谢,感谢您的回复。我找到了一种半途而废的解决方法,我会在这里给出答案,以防其他人偶然发现。
  • @DavidDownes 如何使用这个库文档不清楚,任何资源

标签: python django django-filer


【解决方案1】:

如果其他人遇到这种情况,这是我找到的解决方法。如果你给这个字段一个默认值,那么上传将默认到默认图像所在的任何文件夹。在我的特殊情况下,我想要一个默认图像,所以这用一块石头杀死了两只鸟。

您可以这样做:

首先,请注意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 选择它。

所以这有点笨拙,但是如果您正在努力使某些东西正常工作,也许您可​​以接受。希望这对某人有所帮助。

【讨论】:

  • 看起来很酷,但不幸的是在 Django 1.11.16 和 filer 1.3.2 中似乎不起作用。
【解决方案2】:

不可能以良好且受支持的方式 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 %}

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2018-11-05
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2015-09-08
    • 2020-11-12
    相关资源
    最近更新 更多