Как переименовать переданный файл перед загрузкой в S3
Я пытаюсь создать сайт на Django, где люди могут создавать рецепты с полем для загрузки фотографий. Я настроил загрузку картинок в мое ведро S3 Bucket после отправки формы создания рецепта. Однако сейчас картинка загружается в AWS с оригинальным именем файла. Я хочу, чтобы она была переименована в формат recipe_id.extension перед загрузкой в AWS. У меня есть функция в models.py (см. ниже), которая выполняет операцию переименования за меня. Я просто не знаю, как обработать имя файла через эту функцию перед загрузкой.
В Models.py
class Recipe(models.Model):
# fields
def rename_file(self, filename):
upload_to = 'media/'
ext = filename.split('.')[-1]
if self.pk:
filename = '{}.{}'.format(self.pk, ext)
return os.path.join(upload_to, filename)
def get_pk(self):
return self.pk
recipe_title = models.CharField(max_length=200)
likes = models.PositiveIntegerField(default=0)
pub_date = models.DateTimeField('date published')
instructions = models.TextField(blank=True)
author = models.CharField(max_length=200)
picture = models.FileField(rename_file)
в Views.py
def new_recipe(request):
r = Recipe(recipe_title=request.POST['title'], likes=0, pub_date=timezone.now(), instructions=request.POST['instructions'], author=request.user.username, picture=request.FILES['filename'])
r.save()
return render(request, 'wordofmouth/new_recipe.html', {'recipe': r})
в шаблоне создания рецепта:
{% load socialaccount %}
<html>
<body>
{% include "navbar.html" %}
<div style="text-align:center; margin-top: 8%;">
{% if user.is_authenticated %}
<h1>Welcome Back <span style="color: #73bcf8">{{ user.username }}</span>!</h1>
<p>The is the experiments page</p>
<p>{{ "Submit a new recipe below:" }}</p>
<form action="{% url 'wordofmouth:new_recipe' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<label for="title">Recipe Title:</label><br>
<input type="text" id="title" name="title"><br>
<label for="instructions">Instructions:</label><br>
<input type="text" id="instructions" name="instructions"><br><br>
<input type="file" accept=".jpg,.jpeg,.png" id="filename" name="filename">
<input type="submit" value="Submit">
</form>
<a class="btn btn-primary" style="margin-top: 10px;" href="{% url 'account_logout' %}">Sign Out</a>
{% else %}
<h1>Please log in if you want to make a recipe</h1>
<a class="btn btn-primary" style="margin-top: 10px;"href="{% provider_login_url 'google' %}">Login with Google</a>
{% endif %}
</div>
</body>
</html>
Edit: Как кто-то указал, теперь я знаю, что не могу переименовать файл, поскольку первичный ключ еще не создан. Однако есть ли способ переименовать файл после его загрузки в S3 без изменения содержимого файла?