`
zjxplq
  • 浏览: 40444 次
  • 性别: Icon_minigender_1
  • 来自: 绍兴
社区版块
存档分类
最新评论

在django中动态设置上传路径

阅读更多

参考于:http://scottbarnham.com/blog/2008/08/25/dynamic-upload-paths-in-django/

FileField或ImageField的参数upload_to可以是一个可执行的对象。这个可执行的函数可传入当前model实例与上传文件名,且必须返回一个路径。

下面是一个实例:

 

import os
from django.db import models

def get_image_path(instance, filename):
    return os.path.join('photos', str(instance.id), filename)

class Photo(models.Model):
    image = models.ImageField(upload_to=get_image_path)
 

get_image_path是一个可执行的对象(实际上是函数)。它从Photo的实例中获取id,并将它用于上传路径中。图像上传路径如:photos/1/kitty.jpg

可以使用实例中的任何字段或相关models中的字段。

为了使用get_image_path可用于多个models,可以作如下改进:

 

def get_image_path(path, attribute):
    def upload_callback(instance, filename):
        return '%s%s/%s' % (path, unicode(slugify(getattr(instance, attribute))), filename)
    return upload_callback

...
#Model definitions
class Photo(models.Model):
    name = models.CharField()
    image = models.ImageField(upload_to = get_image_path('uploads/', 'name'))

class Screenshot(models.Model):
    title = models.CharField()
    image = models.ImageField(upload_to = get_image_path('uploads/', 'title'))
 

 

为了更灵活,还可以作如下改进:

 

def get_image_path(path, attribute):
    def upload_callback(instance, filename):
        attributes = attribute.split('.')
        for attr in attributes:
            try:
                instance = getattr(instance,attr)
            except:
                print 'attribute error'
        return '%s%s/%s' % (path,unicode(instance),filename)
    return upload_callback

class Block(models.Model):
    description = models.CharField(max_length=255) 
class Building(models.Model):
    block = models.ForeignKey(Block)
    address = models.CharField(max_length=255)
    image = models.ImageField(upload_to=get_image_path('uploads/','block.description'))
 

作了如此改进后,可以方便的设置与当前实例相关的models中字段了。

 

注意的是如果你使用id,得先确定model实例在上传文件之前保存了,否则id会不存在。为了解决这个情况,在view中可以如下操作

...
    if request.method == 'POST':
        form = PhotoForm(request.POST, request.FILES)
        if form.is_valid():
            photo = Photo.objects.create()
            image_file = request.FILES['image']
            photo.image.save(image_file.name, image_file)
...
 

 

分享到:
评论

相关推荐

    django将图片上传数据库后在前端显式的方法

    前端页面显示图片时,需要在Django的设置文件(settings.py)中配置媒体文件的相关路径。其中`MEDIA_URL`定义了媒体文件的URL前缀,而`MEDIA_ROOT`定义了媒体文件在服务器上的存储目录。 ```python MEDIA_URL = '/...

    django layui表单加图片上传功能(Django,layui).zip

    在本文中,我们将深入探讨如何在Django框架中结合Layui实现图片上传功能。Layui是一款优秀的前端UI框架,而Django是Python后端开发的流行框架,两者结合可以构建出美观且功能强大的Web应用。以下是实现这一功能的...

    Django框架文件上传与自定义图片上传路径、上传文件名操作分析

    本文实例讲述了Django框架文件上传与自定义图片上传路径、上传文件名操作。分享给大家供大家参考,具体如下: 文件上传 1、创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置, ...

    django 连接数据库、上传文件

    在Python的Web开发框架Django中,连接数据库和处理文件上传是两个重要的功能。下面将详细阐述这两个主题。 首先,让我们来谈谈如何在Django中连接MySQL数据库。Django默认使用SQLite数据库,但通过配置可以方便地...

    小程序图片上传至云服务器指定路径后端Django代码

    在这个项目中,开发者通过Django构建了一个接收并处理小程序上传图片的接口。下面我们将详细探讨这个过程中的关键知识点。 首先,Django是一个高级的Python Web框架,它允许快速开发安全和可维护的网站。在处理图片...

    django+ajaxfileupload文件上传demo

    在本文中,我们将深入探讨如何使用Django框架与AjaxFileUpload库实现一个文件上传的示例。Django是一个流行的Python Web开发框架,它提供了一系列强大的功能来构建高效、安全的Web应用。AjaxFileUpload则是一个...

    通过Django的form及Ajax等多种方式上传文件

    通过Django的Form方式上传文件,简单,但无法局部刷新实现ajax效果; 通过js或jQuery方式,需要使用FormData对象,仍有些浏览器不兼容; 通过Form+iframe方式上传文件,兼容性最好。 里面含有全部源代码。

    django实现文件上传并显示的简单例子

    在本文中,我们将深入探讨如何使用Django框架实现文件上传并将其在网页上显示的简单例子。Django是一个流行的Python Web开发框架,以其强大的功能和高效性而受到开发者喜爱。文件上传是Web应用中常见的需求,例如...

    django-3.2中文文档.zip

    这部分可能会讲述如何配置静态文件路径,以及在生产环境中正确地服务于这些文件。 9. **搜索索引(searchindex.js)** - 这个文件可能是文档的全文搜索索引,用于在文档网站上提供快速的关键词搜索功能。 通过...

    django中media媒体路径设置的步骤

    在Django中设置media媒体路径,是将上传的文件与Django项目关联并能在服务器上正确存储和检索的过程。 媒体文件的设置通常包含以下几个步骤: 1. 创建Django应用(app):首先需要创建一个新的Django应用,它相当...

    Django2 文件上传及下载功能(支持中文名文件)python3.7

    在Python的Web开发框架Django中,文件上传和下载是常见的功能需求,尤其在处理用户数据、资源分享或系统备份等方面。本项目基于Django 2.0和Python 3.7,实现了对包括中文名文件在内的文件上传与下载功能。下面将...

    django简易版网盘

    2. **文件上传**:在Django中,文件上传主要通过`django.core.files`和`django.db.models.FileField`实现。开发者需要定义模型字段来存储文件,并创建视图处理文件上传请求,确保安全性和稳定性。 3. **文件下载**...

    django中上传图片分页三级联动效果的实现代码

    - 接着,在`settings.py`中设置`MEDIA_ROOT`来指定上传文件的保存路径,如`os.path.join(BASE_DIR, 'static/media')`。 - 在模型类中,使用`models.ImageField`定义图片字段,例如`goods_pic = models.ImageField...

    django实现MODELFORM文件上传范例

    在这个模型中,`title`字段用于存储文件的标题,而`file`字段则使用`FileField`类型,允许用户上传文件,并且指定了上传后文件存储的相对路径。 接下来,我们需要创建一个基于`Document`模型的ModelForm: ```...

    Django媒体资源学习源代码 (附一套简易Django文件上传源码)

    2. **MEDIA_ROOT**:`MEDIA_ROOT`是Django设置中的一个路径,它定义了存储所有媒体文件的物理位置。这是一个绝对路径,用于告诉Django在哪里查找用户上传的文件。例如,`MEDIA_ROOT = '/var/www/myproject/media/'`...

    部署Django项目

    这个命令会将所有应用的静态文件复制到`STATIC_ROOT`设置指定的目录,这个目录在生产环境中通常会设置为Nginx服务器配置中的静态文件路径。 以上步骤涉及到的Django部署思维导图中提到的各个知识点,将帮助开发者将...

    10分钟入手django

    在settings.py配置文件中,我们需要定义STATIC_URL和STATICFILES_DIRS,前者是静态文件的URL前缀,后者则是静态文件的存储路径。在视图函数中,我们不直接处理静态文件,而是让Web服务器负责。在部署时,应使用...

Global site tag (gtag.js) - Google Analytics