Как переименовать переданный файл перед загрузкой в 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 без изменения содержимого файла?

Вернуться на верх