天道酬勤,学无止境

“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__(*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()

I was using this class with this piece of code to load images and saving them with the model instance.

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()

The question is, how do I create a InMemoryUploadedFile or TemporaryUploadedFile from a file in python?, or any other thing that could work in this context.

评论

Finally I found the answer.

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()

If using Python 3 one adjustment is needed - change 'r' to '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
  • Django delete FileField
    I'm building a web app in Django. I have a model that uploads a file, but I can not delete the file. Here is my code: 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
  • Django基础
    MVC介绍: MVC的全拼为Model-View-Controller, 最早由TrygveReenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一-种软件设计模式,是为了将传统的输入(input) 、处理( processing)、输出(output)任务运用到图形化用户交互模型中而设计的。随着标准输入输入设备的出现,开发人员只需要将精力集中在业务逻辑的分析与实现上。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。现在虽然不再使用原来的分工方式,但是这种分工的思想被沿用下来,广泛应用于软件工程中,是一种典型并且应用广泛的软件架构模式。MVC结构提供了一种按功能对各种对象进行分割的方法(这些对象是用来维护和表现数据的),其目的是为了将各对象间的耦合程度减至最小。现在的MVC结构中,模型(Model)代表应用程序的数据(data) 和用于控制访问和修改这些数据的业务规则(businessrule)。通常模型被用来作为对现实世界中一个处理过程的软件近似,当定义-一个模型时,可以采用--般的简单的建模技术。当模型发生改变时,它会通知视(View) ,并且为视提供查询模型相关状态的能力。同时,它也为控制器(Controller
  • Penetration_Testing_POC-About 渗透测试有关的POC、EXP、脚本、提权、小工具等
    Penetration_Testing_POC 搜集有关渗透测试中用到的POC、脚本、工具、文章等姿势分享,作为笔记吧,欢迎补充。 Penetration_Testing_POC请善用搜索[Ctrl+F]查找IOT Device&Mobile PhoneWeb APP提权辅助相关PCtools-小工具集合文章/书籍/教程相关说明 请善用搜索[Ctrl+F]查找 IOT Device&Mobile Phone 天翼创维awifi路由器存在多处未授权访问漏洞华为WS331a产品管理页面存在CSRF漏洞CVE-2019-16313 蜂网互联企业级路由器v4.31密码泄露漏洞D-Link路由器RCE漏洞CVE-2019-13051-Pi-Hole路由端去广告软件的命令注入&权限提升D-Link DIR-859 - RCE UnAutenticated (CVE-2019–17621)Huawei HG255 Directory Traversal[目录穿越]|本地备份文件D-Link Devices - Unauthenticated Remote Command Execution in ssdpcgi (Metasploit)CVE-2019-20215(Metasploit)从 Interfaces.d 到 RCE:Mozilla WebThings IoT
  • Django, ManyToManyField - ProgrammingError: relation foo_bar does not exist. Recognized in migrations, though relation is never created
    In this case, "foo_bar" is actually "links_userprofile_favorite_feeds". The problem is, when I go into manage.py shell: manage.py shell from django.contrib.auth.models import User from feeds.models import feed p = User.objects.get(username='myuser') p.save() q = Feed.objects.get(title='myfeed') q.save() p.userprofile.favorite_feed.add(q) I get the error: ProgrammingError: relation "links_userprofile_favorite_feeds" does not exist LINE 1: ..."links_userprofile_favorite_feeds"."feed_id" FROM "links_use... Here are the relevant files and traceback: links.models.py class UserProfile(models.Model)
  • 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 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 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中对文件上传进行单元测试(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 REST Framework CurrentUserDefault() with serializer
    I have been trying for a while now to add an 'owner' field to my models. I have looked at other questions but I still have had no luck. Ideally when a new note is created, the current user will be set in the owner field and won't be changeable. Below is my model, serializer, and view for a Note as far as I have gotten. I'm guessing the CurrentUserDefault() function needs additional context but I can't set it properly. views.py class NoteListCreateView(ListCreateAPIView): authentication_classes = (SessionAuthentication, TokenAuthentication) permission_classes = (DjangoModelPermissions,) lookup
  • 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 JQuery Ajax文件上传(Django JQuery Ajax File Upload)
    问题 我已经尝试上传一个简单的文本文件了几个小时,但似乎仍然无法正常工作。 我不断收到无效的表格,说我缺少“ file_source”。 为什么“ file_source”没有发布? 我也有它实际发送“ file_source”,但它仍然说它丢失了。 应该为Django FileFiled提供哪种类型的元素? Django表格: class FileUploadForm(forms.Form): file_source = forms.FileField() Django模板(呈报形式): <form action="/upload/" method="post" id="file-upload-form" enctype="multipart/form-data"> {% csrf_token %} {{ form }} <button type="submit" class="btn btn-primary" id='upload-btn'>Upload</button> </form> jQuery / Ajax上传: function uploadFile() { $.ajax({ data: $(this).serialize(), type: $(this).attr('method'), url: $(this).attr('action') }); return
  • 如何将多个图像上传到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
  • 在运行时确定带有upload_to的Django FileField(Django FileField with upload_to determined at runtime)
    问题 我正在尝试设置我的上传文件,这样,如果用户joe上传文件,它将转到MEDIA_ROOT / joe,而不是让每个人的文件都转到MEDIA_ROOT。 问题是我不知道如何在模型中定义它。 这是目前的样子: class Content(models.Model): name = models.CharField(max_length=200) user = models.ForeignKey(User) file = models.FileField(upload_to='.') 所以我想要的不是“。”。 作为upload_to,请使用它作为用户名。 我知道从Django 1.0开始,您可以定义自己的函数来处理upload_to,但是该函数不知道谁将成为谁,所以我有点迷路了。 谢谢您的帮助! 回答1 您可能已经阅读了文档,所以这里有一个简单的示例可以使之有意义: def content_file_name(instance, filename): return '/'.join(['content', instance.user.username, filename]) class Content(models.Model): name = models.CharField(max_length=200) user = models.ForeignKey(User) file =
  • 使用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
  • upload multiple files in django
    I am new to django, I am trying to upload more than one file from the browser and store them somewhere in computer storage but I am not storing them successfully with this code please help me out to find my mistake or improvements that I can do. Thanks in advance to help. views.py from django.shortcuts import render from django.http import HttpResponse # Create your views here. def Form(request): return render(request, "index/form.html", {}) def Upload(request): for count, x in enumerate(request.FILES.getlist("files")): def process(f): with open('/Users/benq/djangogirls/upload/media/file_' +
  • 仅在服务器端接受FileField中的某种文件类型(Only accept a certain file type in FileField, server-side)
    问题 如何限制FileField以优雅的方式仅在服务器端接受某种类型的文件(视频,音频,pdf等)? 回答1 一种非常简单的方法是使用自定义验证器。 在您的应用程序的validators.py : def validate_file_extension(value): import os from django.core.exceptions import ValidationError ext = os.path.splitext(value.name)[1] # [0] returns path+filename valid_extensions = ['.pdf', '.doc', '.docx', '.jpg', '.png', '.xlsx', '.xls'] if not ext.lower() in valid_extensions: raise ValidationError('Unsupported file extension.') 然后在您的models.py : from .validators import validate_file_extension ...并将验证器用于您的表单字段: class Document(models.Model): file = models.FileField(upload_to="documents/%Y/%m/%d"
  • 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:上传前调整图片大小(Django: resize image before upload)
    问题 我想在上传前调整图片( Pillow )的大小,我在下面编写代码,但是不起作用! 并得到错误: / myapp / list /中的AttributeError _坚定的请求方法:POST 请求网址:http://127.0.0.1:8000/myapp/list/ Django版本:1.8异常类型:AttributeError异常值: _坚定的例外位置: /usr/local/lib/python3.4/dist-packages/Pillow-2.8.1-py3.4-linux-x86_64.egg/PIL/Image.py 在getattr中,第622行Python可执行文件:/usr/bin/python3.4 Python版本:3.4.0 views.py def list(request): # Handle file upload if request.method == 'POST': form = DocumentForm(request.POST, request.FILES) if form.is_valid(): imga = request.FILES['docfile'] size = (600, 400) im = Image.open(imga) imga = im.resize(size) request.FILES['docfile'] =
  • django项目中如何自定义文件存储类,将图片上传到fastdfs分布式文件存储系统
    1. 项目中上传图片到fastdfs和使用图片流程图 2. 自定义文件存储类 (1)项目目录下的utils实用工具包下建立一个fdfs包,将client.conf配置文件复制到该包下,并建立一个storage.py文件 (2)client.conf文件需要修改两个地方如图: (3)storage.py文件中代码如下: from django.core.files.storage import Storage from fdfs_client.client import Fdfs_client import os class FDFSStorage(Storage): """fastdfs 文件存储类""" # django中修改文件的上传行为必须实现下面两个方法 def _open(self, name, mode="rb"): """打开文件时使用""" pass def _save(self, name, content): """保存文件时使用""" # name: 你选择的上传文件的名字 # content: 包含你上传文件内容的File对象 # 创建一个Fdfs_client对象, 需要client配置文件 client = Fdfs_client("./utils/fdfs/client.conf") # 上传文件到fastdfs系统中 ret_dict =