我使用1.2.5标准ImageField并使用内置存储后端.文件上传很好但是当我从管理员删除条目时,服务器上的实际文件不会删除.
我的模型中有一个ImageField,当我保存它时,我想检查它是否为无.
在django shell中,我正在调用我的对象的ImageField,它给出:
>>> p.avatar
<ImageFieldFile: None>
>>> p.avatar is None
False
Run Code Online (Sandbox Code Playgroud)
我发现ImageField的名字是你的',所以还有更好的方法吗?
在Django中,如果模型中有ImageFile,则删除将从磁盘中删除关联文件以及从数据库中删除记录.
不应该替换图像还从磁盘中删除不需要的文件?相反,我发现它保留了原始内容并添加了替代品.
现在删除对象不会删除原始文件只替换.
这样做有什么好的策略吗?如果我的用户频繁更换图像,我不想拥有一堆孤儿文件.
我试图在Django视图中获取ImageField绝对路径,这样我就可以打开图像,在上面写一些东西,然后将其提供给用户.
我在获取保存在媒体文件夹中的图像的绝对路径时遇到问题.
item = get_object_or_404(Item, pk=pk)
absolute_url = settings.MEDIA_ROOT + str(item.image.path)
Run Code Online (Sandbox Code Playgroud)
我得到错误,item.image没有path(The 'banner' attribute has no file associated with it.).item.image是ImageField,我想知道如何获取图像字段中保存的图像的绝对路径(在Django视图中).
我刚刚开始使用django,我还没有找到很多关于如何显示imageField的信息,所以我做了这个:
models.py
class Car(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=5, decimal_places=2)
photo = models.ImageField(upload_to='site_media')
Run Code Online (Sandbox Code Playgroud)
views.py
def image(request):
carx = Car()
variables = RequestContext(request,{
'carx':carx
})
return render_to_response('image.html',variables)
Run Code Online (Sandbox Code Playgroud)
image.html
{% extends "base.html" %}
{% block content %}
<img src=carx />
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我已经保存了一个图像,因为终端,我知道在那里,如果在image.html中这样做:
{% block content %}
{{ carx }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
输出是:汽车对象
谁能告诉我我的错误在哪里?
非常感谢.
这是在杀我!
我正在使用django-filebrowser,我想创建一个图库应用程序,利用它的上传功能来管理图像.
我有一个Gallery模型,允许用户在服务器上选择或创建目录,并将文件上传到该文件夹以显示在库中.我想自动搜索用户已将图像上传到的目录,然后选择该目录,然后自动为该文件夹中的每个图像创建图像实例.
class Gallery(model.Models):
gallerydirectory = FileBrowserField(...)
title = ...
description ...
class Image(model.Models):
image_field = models.ImageField()
Run Code Online (Sandbox Code Playgroud)
问题是FileBrowser表示图像与Django不同,但我想使用DJango ImageFields,因为我可以在模板端使用其他应用程序(sorl缩略图).
我有文件所需的所有数据,即文件名,路径等,我只是无法让Django创建一个ImageField的实例,而无需再次实际上传图像.我只是想填充它.
我在这里看到另一个提示如下的线程:
for image in filebrowser_image_objects_list:
f = File(open('path-to-file-on-server','r'))
i = Image()
i.image_field('filename.png',f.read())
Run Code Online (Sandbox Code Playgroud)
但这给了我一个:
SuspiciousOperation error
Attempted access to '/filename.png' denied
Run Code Online (Sandbox Code Playgroud)
这表明路径没有被正确读取.我打印了文件对象的属性,它正在打开正确的图像,它只是没有被传递到ImageField
帮助将非常感谢!
UPDATE
我已经放弃了尝试这项工作,因为它太乱了.我上面遇到的问题是我将ImageField的upload_field设置为'/'并且它没有被注意到意味着该文件被写入'/something.png'.
我已对其进行了修改,以便Image现在也使用FileBrowserField而不是ImageField.
我正在重写Django的模型删除方法,以便删除磁盘中用于图像字段的孤立文件,如下所示:
class Image(models.Model):
img = models.ImageField(upload_to=get_image_path)
...
def delete(self, *args, **kwargs):
self.img.delete()
super(Image, self).delete(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
当我从管理员中删除单个对象时这很好用,但是当我选择多个对象并删除它们时,似乎没有被调用.我已经谷歌搜索了一段时间,但没有找到正确的关键字来得到答案,也没有官方文档似乎谈论这个主题.
我有一个模型Picture与一个ImageField.删除实例时Picture,ImageField不删除该文件集.
这是一个错误吗?我该怎么做?
给定django图像字段,如何创建PIL图像,反之亦然?
简单的问题,但很难谷歌:(
(我将使用django-imagekit的处理器来旋转已经存储为模型属性的图像.)
编辑
In [41]: m.image_1.__class__
Out[41]: django.db.models.fields.files.ImageFieldFile
In [42]: f = StringIO(m.image_1.read())
In [43]: Image.open(f)
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
<ipython-input-43-39949b3b74b3> in <module>()
----> 1 Image.open(f)
/home/eugenekim/virtualenvs/zibann/local/lib/python2.7/site-packages/PIL/Image.pyc in open(fp, mode)
2023 pass
2024
-> 2025 raise IOError("cannot identify image file")
2026
2027 #
IOError: cannot identify image file
In [44]:
Run Code Online (Sandbox Code Playgroud) 这是我的问题的后续跟进:ImageField/FileField Django表单目前无法修剪文件名的路径
在我的Django应用程序中,有一个上传到S3的图像字段修剪图像文件路径名后,由于修剪了网址,因此无法访问该图像.我如何修剪显示但不修剪路径?
我设法修剪显示文件名的显示
class CustomClearableFileInput(ClearableFileInput):
def get_context(self, name, value, attrs):
logging.debug("%s",name)
logging.debug("%s",value)
value.name = path.basename(value.name)
context = super().get_context(name, value, attrs)
return context
class CompanySettingEdit(forms.ModelForm):
company_logo = forms.ImageField(widget=CustomClearableFileInput)
Run Code Online (Sandbox Code Playgroud)
这是输出:
https://imgur.com/a/M42Mz <-- display correct
https://bucketname.s3.amazonaws.com/media/certiport_logo.png <-- invalid url
Run Code Online (Sandbox Code Playgroud)
如果我不修剪它:
class CustomClearableFileInput(ClearableFileInput):
def get_context(self, name, value, attrs):
logging.debug("%s",name)
logging.debug("%s",value)
# value.name = path.basename(value.name) <-- remove this
context = super().get_context(name, value, attrs)
return context
class CompanySettingEdit(forms.ModelForm):
company_logo = forms.ImageField(widget=CustomClearableFileInput)
Run Code Online (Sandbox Code Playgroud)
这是输出:
https://imgur.com/a/rGi8f <-- display incorrect
https://bucketname.s3.amazonaws.com/media/company_logo/15/certiport_logo.png <--valid url
Run Code Online (Sandbox Code Playgroud)
我的目标是:
display: certiport_logo.png
url: https://bucketname.s3.amazonaws.com/media/company_logo/15/certiport_logo.png …Run Code Online (Sandbox Code Playgroud)