参考于: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的设置文件(settings.py)中配置媒体文件的相关路径。其中`MEDIA_URL`定义了媒体文件的URL前缀,而`MEDIA_ROOT`定义了媒体文件在服务器上的存储目录。 ```python MEDIA_URL = '/...
在本文中,我们将深入探讨如何在Django框架中结合Layui实现图片上传功能。Layui是一款优秀的前端UI框架,而Django是Python后端开发的流行框架,两者结合可以构建出美观且功能强大的Web应用。以下是实现这一功能的...
本文实例讲述了Django框架文件上传与自定义图片上传路径、上传文件名操作。分享给大家供大家参考,具体如下: 文件上传 1、创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置, ...
在本文中,我们将深入探讨如何使用Django框架实现文件上传并将其在网页上显示的简单例子。Django是一个流行的Python Web开发框架,以其强大的功能和高效性而受到开发者喜爱。文件上传是Web应用中常见的需求,例如...
在Python的Web开发框架Django中,连接数据库和处理文件上传是两个重要的功能。下面将详细阐述这两个主题。 首先,让我们来谈谈如何在Django中连接MySQL数据库。Django默认使用SQLite数据库,但通过配置可以方便地...
在这个项目中,开发者通过Django构建了一个接收并处理小程序上传图片的接口。下面我们将详细探讨这个过程中的关键知识点。 首先,Django是一个高级的Python Web框架,它允许快速开发安全和可维护的网站。在处理图片...
在本文中,我们将深入探讨如何使用Django框架与AjaxFileUpload库实现一个文件上传的示例。Django是一个流行的Python Web开发框架,它提供了一系列强大的功能来构建高效、安全的Web应用。AjaxFileUpload则是一个...
通过Django的Form方式上传文件,简单,但无法局部刷新实现ajax效果; 通过js或jQuery方式,需要使用FormData对象,仍有些浏览器不兼容; 通过Form+iframe方式上传文件,兼容性最好。 里面含有全部源代码。
这部分可能会讲述如何配置静态文件路径,以及在生产环境中正确地服务于这些文件。 9. **搜索索引(searchindex.js)** - 这个文件可能是文档的全文搜索索引,用于在文档网站上提供快速的关键词搜索功能。 通过...
在Django中设置media媒体路径,是将上传的文件与Django项目关联并能在服务器上正确存储和检索的过程。 媒体文件的设置通常包含以下几个步骤: 1. 创建Django应用(app):首先需要创建一个新的Django应用,它相当...
在Python的Web开发框架Django中,文件上传和下载是常见的功能需求,尤其在处理用户数据、资源分享或系统备份等方面。本项目基于Django 2.0和Python 3.7,实现了对包括中文名文件在内的文件上传与下载功能。下面将...
2. **文件上传**:在Django中,文件上传主要通过`django.core.files`和`django.db.models.FileField`实现。开发者需要定义模型字段来存储文件,并创建视图处理文件上传请求,确保安全性和稳定性。 3. **文件下载**...
- 接着,在`settings.py`中设置`MEDIA_ROOT`来指定上传文件的保存路径,如`os.path.join(BASE_DIR, 'static/media')`。 - 在模型类中,使用`models.ImageField`定义图片字段,例如`goods_pic = models.ImageField...
在这个模型中,`title`字段用于存储文件的标题,而`file`字段则使用`FileField`类型,允许用户上传文件,并且指定了上传后文件存储的相对路径。 接下来,我们需要创建一个基于`Document`模型的ModelForm: ```...
2. **MEDIA_ROOT**:`MEDIA_ROOT`是Django设置中的一个路径,它定义了存储所有媒体文件的物理位置。这是一个绝对路径,用于告诉Django在哪里查找用户上传的文件。例如,`MEDIA_ROOT = '/var/www/myproject/media/'`...
这个命令会将所有应用的静态文件复制到`STATIC_ROOT`设置指定的目录,这个目录在生产环境中通常会设置为Nginx服务器配置中的静态文件路径。 以上步骤涉及到的Django部署思维导图中提到的各个知识点,将帮助开发者将...
在settings.py配置文件中,我们需要定义STATIC_URL和STATICFILES_DIRS,前者是静态文件的URL前缀,后者则是静态文件的存储路径。在视图函数中,我们不直接处理静态文件,而是让Web服务器负责。在部署时,应使用...