63
How are you uploading the file?
I assume with the FileField
.
The documentation for FileField.upload_to says that the upload_to
field,
may also be a callable, such as a
function, which will be called to
obtain the upload path, including the
filename. This callable must be able
to accept two arguments, and return a
Unix-style path (with forward slashes)
to be passed along to the storage
system. The two arguments that will be
passed are:
"instance": An instance of
the model where theFileField
is
defined. More specifically, this is
the particular instance where the
current file is being attached."filename":The filename that was
originally given to the file. This may
or may not be taken into account when
determining the final destination
path.
So it looks like you just need to make a function to do your name handling and return the path.
def update_filename(instance, filename):
path = "upload/path/"
format = instance.userid + instance.transaction_uuid + instance.file_extension
return os.path.join(path, format)
13
You need to have a FileField
with the upload_to
that calls to a callback, see [1]
Your callback should call a wrapper method which gets an instance as one of the params and filename as the other. [2]
Change it the way you like and return the new path [3]
1. LOGIC
FileField(..., upload_to=method_call(params),....)
2. define method
def method_call(params):
return u'abc'
3. Wrapper:
def wrapper(instance, filename):
return method
this is the rapper method that you need for getting the instance.
def wrapper(instance, filename):
... Your logic
...
return wrapper
Complete Code
def path_and_rename(path, prefix):
def wrapper(instance, filename):
ext = filename.split('.')[-1]
project = "pid_%s" % (instance.project.id,)
# get filename
if instance.pk:
complaint_id = "cid_%s" % (instance.pk,)
filename = '{}.{}.{}.{}'.format(prefix, project, complaint_id, ext)
else:
# set filename as random string
random_id = "rid_%s" % (uuid4().hex,)
filename = '{}.{}.{}.{}'.format(prefix, project, random_id, ext)
# return the whole path to the file
return os.path.join(path, filename)
return wrapper
Call to Method
sales_attach = models.FileField("Attachment", upload_to=path_and_rename("complaint_files", 'sales'), max_length=500,
help_text="Browse a file")
Hope this helps.
Thanks.
- [Django]-Django auto_now and auto_now_add
- [Django]-Auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'UserManage.groups'
- [Django]-Serializing list to JSON
11
if you want your function re-usable:
import hashlib
import datetime
import os
from functools import partial
def _update_filename(instance, filename, path):
path = path
filename = "..."
return os.path.join(path, filename)
def upload_to(path):
return partial(_update_filename, path=path)
You just have to use it this way:
document = models.FileField(upload_to=upload_to("my/path"))
- [Django]-Is APITest with Query params different then just normal url?
- [Django]-Django: How to format a DateField's date representation?
- [Django]-Can Django automatically create a related one-to-one model?
2
import random
import os
def generate_unique_name(path):
def wrapper(instance, filename):
extension = "." + filename.split('.')[-1]
filename = str(random.randint(10,99)) + str(random.randint(10,99)) + str(random.randint(10,99)) + str(random.randint(10,99)) + extension
return os.path.join(path, filename)
return wrapper
#You just have to use it this way:#
photo = models.FileField("Attachment", upload_to=generate_unique_name("pics"),max_length=500,help_text="Browse a photo")
- [Django]-Django REST Framework POST nested objects
- [Django]-A Better Django Admin ManyToMany Field Widget
- [Django]-How to write django test meant to fail?
2
Incase this may help anyone.
import os
import uuid
import random
from datetime import datetime
def user_directory_path(instance, filename):
# Get Current Date
todays_date = datetime.now()
path = "uploads/{}/{}/{}/".format(todays_date.year, todays_date.month, todays_date.day)
extension = "." + filename.split('.')[-1]
stringId = str(uuid.uuid4())
randInt = str(random.randint(10, 99))
# Filename reformat
filename_reformat = stringId + randInt + extension
return os.path.join(path, filename_reformat)
class MyModel(models.Model):
upload = models.FileField(upload_to=user_directory_path)
- [Django]-Reducing Django Memory Usage. Low hanging fruit?
- [Django]-Altering database tables in Django
- [Django]-Django admin sort foreign key field list
1
That much code is not needed you can just use single line code
fille._name=userid + transaction_uuid + file_extension
Like
class xyz(models.Model):
file = models.FileField(upload_to="notice/")
def add(request):
file = request.POST['file']
file._name = request.user.id + transaction_uuid +"."+ file._name.split('.')[1]
you can overwrite file name by overwriting _name value of file object.
- [Django]-How can I programmatically obtain the max_length of a Django model field?
- [Django]-Django: How do I add arbitrary html attributes to input fields on a form?
- [Django]-Django : Is it impossible to static tag into block tag?
0
You can try this also work, name_of_submission is any column you want to attach the file
import os
def update_filename(instance, filename):
path = "upload/path/"
ext = filename.split('.')[-1]
format = instance.name_of_submission + str(instance.id_application) + "." + ext
print(format)
return os.path.join(path, format)
- [Django]-Favorite Django Tips & Features?
- [Django]-Django's SuspiciousOperation Invalid HTTP_HOST header
- [Django]-Why is logged_out.html not overriding in django registration?
-1
The basic way is
import os
os.rename('a.txt', 'b.html')
For your situation, it would probably look like
os.rename ("a.txt", "{id}{uuid}.{ext}".format(id=userid, uuid=transaction_uuid, ext=file_extension))
- [Django]-How can I register a single view (not a viewset) on my router?
- [Django]-Calling Django `reverse` in client-side Javascript
- [Django]-Django URLs TypeError: view must be a callable or a list/tuple in the case of include()
-1
Hi, i check all the answers, but someone are not updated, this is how
in 2022 works whith clean code and following the Django Documentation
Here, remember that you need to make a MIGRATION to make this work:def AvatarSave(instance, filename): #this line changes the name of the file to the user name and put the file extension at the end after the point return 'users/avatars/{0}.{1}'.format(instance.id,filename.split('.')[-1]) avatar = models.ImageField(_("avatar"),upload_to=AvatarSave)
- [Django]-Authenticate by IP address in Django
- [Django]-Django get a random object
- [Django]-How to do SELECT COUNT(*) GROUP BY and ORDER BY in Django?