使用 django-filer,我可以从 'Unsorted Uploads' 选择图像进入的文件夹吗
Using django-filer, can I chose the folder that images go into, from 'Unsorted Uploads'
我是第一次使用 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 进入单独的文件夹,以便管理员用户更容易 sorting/searching。
我试过了
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 ...",要么就是不做我希望的事情。
干杯!
以防其他人遇到此问题,这是我找到的解决方法。如果你给这个字段一个默认值,那么上传将默认到默认图像所在的任何文件夹。在我的特殊情况下,无论如何我想要一个默认图像所以这杀死了两只鸟。
以下是您可以如何做到这一点:
首先,请注意 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)
这个实现有一些明显的注意事项。如果您的默认图片名称更改,您将回到没有默认图片的状态(因此,上传到 'Unsorted Uploads')。如果有多个具有该名称,则您的方法必须选择一个。我选择最近上传的一个。
如果您有信心永远不想更改默认图像实例,您可以 select id
。
所以这有点笨拙,但如果您正在努力让某些东西正常工作,也许您会接受。希望这对某人有所帮助。
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。
如果页面上有多个字段,则需要进行更多调整,and/or如果它们是内联的一部分。 YMMV.
另一种方法是覆盖 filer/templates/admin/filer/widgets/admin_file.html
并更改
{% url 'admin:filer-ajax_upload' %}
到
{% url 'admin:filer-ajax_upload' folder_id=1 %}
我是第一次使用 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 进入单独的文件夹,以便管理员用户更容易 sorting/searching。
我试过了
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 ...",要么就是不做我希望的事情。
干杯!
以防其他人遇到此问题,这是我找到的解决方法。如果你给这个字段一个默认值,那么上传将默认到默认图像所在的任何文件夹。在我的特殊情况下,无论如何我想要一个默认图像所以这杀死了两只鸟。
以下是您可以如何做到这一点:
首先,请注意 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)
这个实现有一些明显的注意事项。如果您的默认图片名称更改,您将回到没有默认图片的状态(因此,上传到 'Unsorted Uploads')。如果有多个具有该名称,则您的方法必须选择一个。我选择最近上传的一个。
如果您有信心永远不想更改默认图像实例,您可以 select id
。
所以这有点笨拙,但如果您正在努力让某些东西正常工作,也许您会接受。希望这对某人有所帮助。
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。
如果页面上有多个字段,则需要进行更多调整,and/or如果它们是内联的一部分。 YMMV.
另一种方法是覆盖 filer/templates/admin/filer/widgets/admin_file.html
并更改
{% url 'admin:filer-ajax_upload' %}
到
{% url 'admin:filer-ajax_upload' folder_id=1 %}