天道酬勤,学无止境

从Django Shell“上传”文件(“Upload” a file from django shell)

问题

我需要从excel文件和包含图像的文件夹中导入一些数据,excel中的每一行都描述了每个条目,并且在该文件夹中有一个文件名列表(与条目相关的照片)。

我已经完成了一个脚本,该脚本在数据库中创建每个条目并通过django shell将其保存,但是我不知道如何实例化InMemoryUploadedFile并将其与模型一起保存。

在django 1.0中,我有一个小类,可以让我做我需要做的事,但是随着django 1.1中的更改​​,它不再起作用了。

class ImportFile(file):
    def __init__(self, *args, **kwargs):
        super(ImportFile, self).__init__(*args, **kwargs)
        self._file = self
        self.size = os.path.getsize(self.name)

    def __len__(self):
        return self.size

    def chunks(self, chunk_size=None):
        self._file.seek(0)
        yield self.read()

我在这段代码中使用了此类,以加载图像并将其与模型实例一起保存。

for photo in photos:
    f = ImportFile(os.path.join(IMPORT_DIR, 'fotos', photo), 'r')
    p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
    name = str(uuid1()) + os.path.splitext(f.name)[1]
    p.image.save(name, f)
    p.save()

问题是,如何从python中的文件创建InMemoryUploadedFile或TemporaryUploadedFile?或者在这种情况下可以工作的任何其他方法。

回答1

终于我找到了答案。

from django.core.files import File

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'r'))
p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
name = str(uuid1()) + os.path.splitext(f.name)[1]
p.image.save(name, f)
p.save()
回答2

如果使用Python 3,则需要进行一次调整-将'r'更改为'rb':

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Django删除FileField(Django delete FileField)
    问题 我正在Django中构建一个Web应用程序。 我有一个上传文件的模型,但是我不能删除该文件。 这是我的代码: class Song(models.Model): name = models.CharField(blank=True, max_length=100) author = models.ForeignKey(User, to_field='id', related_name="id_user2") song = models.FileField(upload_to='/songs/') image = models.ImageField(upload_to='/pictures/', blank=True) date_upload = models.DateField(auto_now_add=True) def delete(self, *args, **kwargs): # You have to prepare what you need before delete the model storage, path = self.song.storage, self.song.path # Delete the model before the file super(Song, self).delete(*args, **kwargs) # Delete the
  • 运维管理平台开发思路
    1 应用技术 后端 Python3.7 Django2.x Celery4.x Saltstack Restful Mysql Redis 前端 jquery bootstrap bootstrap-table bootstrap-fileinput 2 实现过程 2.1 CMDB资产管理 2.1.1 资产录入 前端页面填写表单, 提交数据到Django后台, 通过Django Orm操作写入到Mysql数据库 data_info = {'id':1,'ip':'192.168.56.1','hostname':'test'} OpServerM.objects.get_or_create(**data_info) 2.1.2 资产删除 同上类似 2.1.3 资产修改 前端利用bootstrapTable编辑 通过ajax提交修改数据到Django后台 然后通过Orm操作更新入库 update_data = {'id':1,'ip':'192.168.56.101','hostname':'test01'} server = OpServerM.objects.filter(pk=update_data['id']) server.update(**update_data) 2.1.4 批量导入资产 前端利用bootstrap-fileinput上传数据到Django后台
  • 如何在Django中上传文件? [关闭](How to upload a file in Django? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 5年前关闭。 改善这个问题 作为Django的新手,我很难在Django 1.3中制作上传应用程序。 我找不到任何最新的示例/代码段。 有人可以发布一个最小但完整的(模型,视图,模板)示例代码来这样做吗? 回答1 哎呀,Django文档确实没有很好的例子。 我花了2个多小时来挖掘所有内容,以了解其工作原理。 有了这些知识,我实现了一个项目,该项目可以上传文件并将其显示为列表。 要下载该项目的源代码,请访问https://github.com/axelpale/minimal-django-file-upload-example或克隆它: > git clone https://github.com/axelpale/minimal-django-file-upload-example.git 2013年1月30日更新: GitHub上的源代码除了1.3之外,还实现了Django 1.4的实现。 尽管变化不大,但以下教程对1.4也很有用。 2013年5月10日更新: GitHub上Django 1.5的实现。 urls.py中重定向的微小变化以及list.html中url模板标记的用法。 感谢hubert3的努力。 2013年12月7日更新:
  • Django文件上传大小限制(Django File upload size limit)
    问题 我的django应用程序中有一个表单,用户可以在其中上传文件。 我如何设置上传文件大小的限制,以便如果用户上传的文件大于我的限制,则该表格将无效并且会引发错误? 回答1 此代码可能会有所帮助: # Add to your settings file CONTENT_TYPES = ['image', 'video'] # 2.5MB - 2621440 # 5MB - 5242880 # 10MB - 10485760 # 20MB - 20971520 # 50MB - 5242880 # 100MB 104857600 # 250MB - 214958080 # 500MB - 429916160 MAX_UPLOAD_SIZE = "5242880" #Add to a form containing a FileField and change the field names accordingly. from django.template.defaultfilters import filesizeformat from django.utils.translation import ugettext_lazy as _ from django.conf import settings def clean_content(self): content = self
  • 如何在Django中对文件上传进行单元测试(how to unit test file upload in django)
    问题 在我的django应用中,我有一个完成文件上传的视图。核心代码段是这样的 ... if (request.method == 'POST'): if request.FILES.has_key('file'): file = request.FILES['file'] with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest: for chunk in file.chunks(): dest.write(chunk) 我想对视图进行单元测试。我计划测试快乐路径和失败路径。即, request.FILES没有键'file'的情况, request.FILES['file'] None .. 如何设置幸福道路的帖子数据?有人可以告诉我吗? 回答1 从Client.post上的Django文档中: 提交文件是一种特殊情况。 要发布文件,只需提供文件字段名称作为键,并提供要上传的文件的文件句柄作为值。 例如: c = Client() with open('wishlist.doc') as fp: c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp}) 回答2 我以前对with open('some_file.txt') as fp
  • 从Django 1.4.3中的媒体文件夹下载文件(已上传)(Downloading the files(which are uploaded) from media folder in django 1.4.3)
    问题 我正在使用django设计用于处理从media文件夹上uploading文件和从中downloading文件的基本网页 实际上,文件已成功上传到媒体文件夹中,文件也已成功下载,但underscore作为last charater file_one.pdf_附加在file_name last charater例如file_one.pdf_ , file_two.pdf_ , file_three.txt_等, 以下是我的代码 urls.py urlpatterns = patterns('', url(r'^upload$', 'learn_django.views.upload'), url(r'^files_list$', 'learn_django.views.files_list'), url(r'^download/(?P<file_name>.+)$', 'learn_django.views.download'), ) if settings.DEBUG: urlpatterns = patterns('', url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), ) +
  • Django:验证上传文件的文件类型(Django: Validate file type of uploaded file)
    问题 我有一个可以让人们上传文件的应用程序,表示为UploadedFiles 。 但是,我要确保用户仅上传xml文件。 我知道我可以使用magic做到这一点,但是我不知道将检查放在何处-据我所知,我无法将其放在clean函数中,因为当clean运行时该文件尚未上载。 这是UploadedFile模型: class UploadedFile(models.Model): """This represents a file that has been uploaded to the server.""" STATE_UPLOADED = 0 STATE_ANNOTATED = 1 STATE_PROCESSING = 2 STATE_PROCESSED = 4 STATES = ( (STATE_UPLOADED, "Uploaded"), (STATE_ANNOTATED, "Annotated"), (STATE_PROCESSING, "Processing"), (STATE_PROCESSED, "Processed"), ) status = models.SmallIntegerField(choices=STATES, default=0, blank=True, null=True) file = models.FileField(upload_to=settings
  • “Upload” a file from django shell
    I need to import some data from a excel file and a folder with images, every row in the excel describes every entry and have a list of filenames in the folder (photos related to the entry). I've done a script which creates every entry in the database and saves it trough the django shell, but i have no idea how to instantiate a InMemoryUploadedFile for save it with the model. In django 1.0 I had this small class which allowed me to do what i need, but with changes in django 1.1 it's not working any more. class ImportFile(file): def __init__(self, *args, **kwargs): super(ImportFile, self).__init
  • 如何从Django Shell执行Python脚本?(How to execute a Python script from the Django shell?)
    问题 我需要从Django Shell执行Python脚本。 我试过: ./manage.py shell << my_script.py 但这没有用。 只是在等我写东西。 回答1 <<部分是错误的,请使用<代替: $ ./manage.py shell < myscript.py 您也可以这样做: $ ./manage.py shell ... >>> execfile('myscript.py') 对于python3,您需要使用 >>> exec(open('myscript.py').read()) 回答2 不建议您从shell中执行此操作-这是出于您实际上不应该在django环境中执行随机脚本的目的(但是有很多解决方法,请参见其他答案)。 如果您要多次运行该脚本,则最好将其设置为自定义命令,即 $ ./manage.py my_command 为此,在app的management和commands的子目录中创建一个文件,即 my_app/ __init__.py models.py management/ __init__.py commands/ __init__.py my_command.py tests.py views.py 并在此文件中定义您的自定义命令(确保文件名是您要从./manage.py执行的命令的名称) from django.core
  • 如何将多个图像上传到django中的博客文章(how to upload multiple images to a blog post in django)
    问题 我正在尝试允许每个用户将多个图片上传到单个博客文章中。 几天来,我一直在尝试找出最佳方法。 最佳做法是什么? 从我所读的内容中,我应该从博客文章模型中创建一个单独的图像模型,并使用外键。 是对的吗? 接下来是如何允许他们同时上传多张图片的问题。 我是否应该假设我应该使用放置区之类的东西? 我们也欢迎您提供有关存储照片的最佳做法的任何建议。 我看过Amazon s3和cloudinary。 我想创建一些可扩展的东西。 任何帮助将非常感激! 回答1 您只需要两个模型。 一个用于发布,另一个用于图片。 您的图像模型将具有Post模型的外键: from django.db import models from django.contrib.auth.models import User from django.template.defaultfilters import slugify class Post(models.Model): user = models.ForeignKey(User) title = models.CharField(max_length=128) body = models.CharField(max_length=400) def get_image_filename(instance, filename): title = instance
  • 只需将文件保存到Django中的文件夹(Simply save file to folder in Django)
    问题 我有一段代码可以通过POST从表单获取文件。 file = request.FILES['f'] 将文件保存到我的媒体文件夹中的最简单方法是什么 settings.MEDIA_ROOT 我当时在看这个答案,但是在引用未定义的名称和无效的“块”方法时遇到了错误。 必须有一个简单的方法来做到这一点吗? 我的views.py中的EDIT上传方法: def upload(request): folder = request.path.replace("/", "_") uploaded_filename = request.FILES['f'].name # create the folder if it doesn't exist. try: os.mkdir(os.path.join(settings.MEDIA_ROOT, folder)) except: pass # save the uploaded file inside that folder. full_filename = os.path.join(settings.MEDIA_ROOT, folder, uploaded_filename) fout = open(full_filename, 'wb+') file_content = ContentFile( request.FILES['f'].read()
  • 为什么我不能通过admin /将jpg文件上传到我的Django应用中?(Why can't I upload jpg files to my Django app via admin/?)
    问题 我正在尝试将图像添加到我的Django应用程序中的模型中。 models.py class ImageMain(models.Model): product = models.ForeignKey(Product) photo = models.ImageField(upload_to='products') 在开发模式下,每次我尝试通过Django admin上传图像时,都会不断得到: 上载有效图像。 您上传的文件不是图像或图像已损坏。 我通过芬克安装libjpeg,然后在OX X 10.5.7上安装了PIL 1.1.6 from PIL import Image file = open('/Users/Bryan/work/review_app/media/lcdtvs/samsung_UN46B6000_front.jpg', 'r') trial_image = Image.open(file) trial_image.verify() 似乎jpg基于该会话是有效的。 但是,它不会加载。 我尝试了其他jpg,但它们也不起作用。 可能出什么问题了? 我能够成功上传png文件。 回答1 在系统上已经编译/安装了PIL之后,您是否安装了libjpeg? 也许找不到正确的解码器? 这是我在Mac OS上完美播放libjpeg和PIL时发现的一组指令(请参阅最后
  • 以编程方式将图像保存到Django ImageField(Programmatically saving image to Django ImageField)
    问题 好的,我已经尝试了几乎所有内容,但无法正常工作。 我有一个上面带有ImageField的Django模型我有通过HTTP下载图像的代码(已测试并且可以工作) 图像直接保存到“ upload_to”文件夹中(upload_to是在ImageField上设置的文件夹) 我需要做的就是将已经存在的图像文件路径与ImageField相关联 我已经用6种不同的方式编写了这段代码。 我遇到的问题是我正在编写的所有代码均导致以下行为:(1)Django将创建第二个文件,(2)重命名新文件,在文件末尾添加_名称,然后(3)基本上不会将任何数据保留为空的重命名文件。 在“ upload_to”路径中剩下的是2个文件,一个是实际图像,一个是图像名称,但为空,当然ImageField路径设置为Django尝试创建的空文件。 。 如果不清楚,我将尝试说明: ## Image generation code runs.... /Upload generated_image.jpg 4kb ## Attempt to set the ImageField path... /Upload generated_image.jpg 4kb generated_image_.jpg 0kb ImageField.Path = /Upload/generated_image_.jpg
  • Django Rest Framework文件上传(Django Rest Framework File Upload)
    问题 我正在使用Django Rest Framework和AngularJs上传文件。 我的视图文件如下所示: class ProductList(APIView): authentication_classes = (authentication.TokenAuthentication,) def get(self,request): if request.user.is_authenticated(): userCompanyId = request.user.get_profile().companyId products = Product.objects.filter(company = userCompanyId) serializer = ProductSerializer(products,many=True) return Response(serializer.data) def post(self,request): serializer = ProductSerializer(data=request.DATA, files=request.FILES) if serializer.is_valid(): serializer.save() return Response(data=request.DATA) 由于post方法的最后一行应返回所有数据
  • 使用Django强制使用唯一的上传文件名?(Enforce unique upload file names using django?)
    问题 使用django在服务器上使用唯一文件名重命名照片的最佳方法是什么? 我想确保每个名称仅使用一次。 是否有可能使用GUID的pinax应用程序可以做到这一点? 回答1 使用uuid。 要将其绑定到模型中,请参阅Django文档中的FileField upload_to。 例如,在您的models.py中定义以下函数: import uuid import os def get_file_path(instance, filename): ext = filename.split('.')[-1] filename = "%s.%s" % (uuid.uuid4(), ext) return os.path.join('uploads/logos', filename) 然后,在定义FileField / ImageField时,将get_file_path指定为upload_to值。 file = models.FileField(upload_to=get_file_path, null=True, blank=True, verbose_name=_(u'Contact list')) 回答2 更好的方法是在helpers.py中使用公共类。 这样,您可以在应用程序中重用随机文件生成器。 在您的helpers.py中: import os import uuid from
  • Django REST Framework上传图片:“提交的数据不是文件”(Django REST Framework upload image: “The submitted data was not a file”)
    问题 我正在研究如何在Django中上传文件,在这里我遇到了一个不容易理解的问题,并出现以下错误: 提交的数据不是文件。 检查表单上的编码类型。 下面是详细信息。 注意:我还查看了Django Rest Framework ImageField,并尝试了 serializer = ImageSerializer(data=request.data, files=request.FILES) 但是我明白了 TypeError: __init__()获得了意外的关键字参数'files' 我有一个Image模型,我想通过Django REST框架与之交互: models.py class Image(models.Model): image = models.ImageField(upload_to='item_images') owner = models.ForeignKey( User, related_name='uploaded_item_images', blank=False, ) time_created = models.DateTimeField(auto_now_add=True) serializers.py class ImageSerializer(serializers.ModelSerializer): image = serializers
  • 如何为Django设置Jupyter / IPython Notebook?(How do I set up Jupyter/IPython Notebook for Django?)
    问题 我一直在使用本文中描述的方法来设置IPython Notebook,使其与Django配合使用。 该方法的要点是创建一个IPython扩展,该扩展设置DJANGO_SETTINGS_MODULE并在IPython启动时运行django.setup()。 该扩展的代码是: def load_ipython_extension(ipython): # The `ipython` argument is the currently active `InteractiveShell` # instance, which can be used in any way. This allows you to register # new magics or aliases, for example. try: import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") import django django.setup() except ImportError: pass 在最近升级到Jupyter Notebook的情况下,此设置对我而言已无效。 通过在笔记本的第一个单元格中添加类似的代码,我可以在Jupyter笔记本中运行Django代码。 但是,我无法弄清楚如何让Jupyter自动运行扩展程序
  • Python后台开发(第二章: 模型类实现)
    Python后台开发(第二章: 模型类实现) 1 ORM原理与数据库配置1.1 模块安装1.2 模块安装常见问题1.3 Pycharm连接 Mysql1.4 Pycharm—数据库创建1.5 ORM框架原理1.6 数据库信息配置 2 Model模型层2.1 Model 概述2.2 快速入门2.3 常用字段2.4 常用字段约束2.5 数据库迁移2.5.1 概念2.5.2 迁移命令 2.6 模型类的增删改查2.6.1 定义模型类2.6.2 进入shell交互式编程2.6.3 增加数据2.6.3.1 create方法2.6.3.2 模型对象.save() -推荐使用 2.6.4 删除数据2.6.5 修改数据2.6.5.1 save()2.6.5.2 update()2.6.6 查询数据2.6.6.1 查询语法格式2.6.6.2 比较查询2.6.6.3 模糊查询2.6.6.4 范围查询2.6.6.6 Q对象 2.7 懒加载2.7.1 原理2.7.2 实例2.8 链式调用2.8.1 原理2.8.2 QuerySet方法参数2.8.3 代码实例 1 ORM原理与数据库配置 1.1 模块安装 代码部分: pip install pymysql pip install mysqlclient 1.2 模块安装常见问题 time out 超时解决方案: pip install 包名 --user-i
  • Django图像大小调整并在上传前进行转换(Django image resizing and convert before upload)
    问题 我在这个主题上进行了很多搜索,但找不到真正需要的东西。 我会解释我的问题: 在我的网站上,用户可以上传图像。 我需要调整此图片的大小并将其转换为JPEG,然后再上传。 我在Views.py中看到了使用方法的一些解决方案,但我想通过重写Models.py中的save()方法来实现。 问题是,我发现所有用于在save方法中调整图像大小的解决方案都是在第一次保存(称为超级功能)后才执行的,这意味着它不使用带宽(如果我使用CDN)(我对此是正确的)观点?)。 感谢您的帮助 回答1 首先,最好建立正确的语言。 Django和Python仅存在于服务器端。 因此,必须将它们操作,保存或以其他方式使用的所有内容首先发送到服务器。 如果要使用Django或Python管理照片,则用户必须首先将此照片上传到服务器。 上传照片后,Django可以自由地进行更改,然后再存储文件。 如果您关注的是上传带宽,并且不想上传大文件,则必须在客户端上调整照片的大小并重新设置其格式。 如果这是一个Web应用程序,则可以使用Javascript来完成,但是不能使用Python来完成,因为Python不会在像您这样的应用程序的客户端上运行。 如果您不关心带宽,那么您可以自由地让用户“上传”文件,但是在保存之前让Django调整大小并重新格式化。 您是正确的,您将要覆盖照片对象的保存功能。
  • IOError:请求数据读取错误(IOError: request data read error)
    问题 我似乎正在收到IOError:当我执行Ajax上传时,请求数据读取错误很多。 例如,每5个文件上传一次,就会至少出现3次错误。 其他人似乎也有同样的问题。 例如。 Django上传失败,请求数据读取错误 Django文件上传偶尔会失败 其他一些观察: 绝对不是我的互联网连接或浏览器问题。 似乎在所有浏览器chrome / FF / opera上都在发生。 我正在lucid上运行Django 1.1.1 Apache / 2.2.14(Ubuntu)mod_ssl / 2.2.14 OpenSSL / 0.9.8k mod_wsgi / 2.8 Python / 2.6.5 。 它也不是文件大小。 有时我可以上传1个以上的MB文件,但无法上传180 Kb的文件。 追溯 Traceback (most recent call last): File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/core/handlers/base.py", line 98, in get_response response = middleware_method(request, e) File "/home/ubuntu/.virtualenvs/anonymous_app/lib