Как изменить имя файла при загрузке поля изображения в Django
При загрузке поля изображения (медиафайла) в Django возникает вопрос о переименовании файла.
Урл страницы для загрузки изображения содержит pk внешнего ключа. Я хочу переименовать файл изображения в {pk}.png при загрузке изображения.
Когда код ниже работает, он сохраняется как none. В чем проблема?
[urls.py]
app_name = 'dataroom'
urlpatterns = [
path('det/<int:research_id>/', views.detData, name='DataDet'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
[models.py]
import .utils import rename_imagefile_to_uuid
class protocol_upload(models.Model):
trial = models.ForeignKey(Research, on_delete=models.SET_NULL, blank=True, null=True)
protocol_file = models.FileField(upload_to='protocol/', null=True, blank=True)
clusion= models.ImageField(upload_to='criteria/clusion/', null=True, blank=True)
reference = models.ImageField(upload_to=rename_imagefile_to_uuid, storage=OverwriteStorage(), null=True, blank=True)
def image_save(self, *args, **kwargs):
if self.id is None:
saved_image = self.reference
self.reference = None
super(protocol_upload, self).save(*args, **kwargs)
self.reference = saved_image
super(protocol_upload, self).save(*args, **kwargs)
def __str__(self):
return str(self.trial)
[utils.py]
import os
from uuid import uuid4
def rename_imagefile_to_uuid(instance, filename):
upload_to = 'reference/'
ext = filename.split('.')[-1]
uuid = uuid4().hex
if instance:
filename = '{}.{}'.format(instance.id, ext)
else:
filename = '{}.{}'.format(uuid, ext)
return os.path.join(upload_to, filename)
[views.py]
def detData(request, research_id):
research = Research.objects.get(id=research_id)
protocol = protocol_upload.objects.all()
for reference in request.FILES.getlist('reference'):
protocol = protocol_upload()
protocol.research = research_id
protocol.reference = reference
protocol.save()
context = {
'protocol': protocol,
'research': research,
}
return render(request, '/detail.html', context)
[detai.html]
<form method="POST" action="{% url 'dataroom:DataDet' research_id=research.id %}" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="reference" multiple>
<input type="submit" value="Submit">
</form>