What's the best way to rename photos with a unique filename on the server as they are uploaded, using django? I want to make sure each name is used only once. Are there any pinax apps that can do this, perhaps with GUID?
Use uuid. To tie that into your model see Django documentation for FileField upload_to.
For example in your models.py define the following function:
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)
Then, when defining your FileField/ImageField, specify
get_file_path as the
file = models.FileField(upload_to=get_file_path, null=True, blank=True, verbose_name=_(u'Contact list'))
A better way could be using a common class in your helpers.py. This way you could reuse the random file generator across your apps.
In your helpers.py:
import os import uuid from django.utils.deconstruct import deconstructible @deconstructible class RandomFileName(object): def __init__(self, path): self.path = os.path.join(path, "%s%s") def __call__(self, _, filename): # @note It's up to the validators to check if it's the correct file type in name or if one even exist. extension = os.path.splitext(filename) return self.path % (uuid.uuid4(), extension)
And then in your model just import the helper class:
from mymodule.helpers import RandomFileName
And then use it:
logo = models.ImageField(upload_to=RandomFileName('logos'))