Переименование загруженных файлов с помощью первичных ключей django

Используя принятый и второй ответы в этом сообщении, я создал функцию переименования файла, которая находится в моем models.py:

class PathAndRename(object):

def __init__(self, sub_path):
    self.path = sub_path

def __call__(self, instance, filename):
    ext = filename.split('.')[-1]
    # set filename as random string
    if instance.pk:
        filename = '{}/{}'.format(instance.pk, filename)
    else:
        filename = '{}/{}.{}'.format(instance.pk, uuid4().hex, ext)
    # return the whole path to the file
    return os.path.join(self.path, filename)

path_and_rename = PathAndRename("")

class Post(models.Model):
    File = models.FileField(blank=True, null=True, upload_to = path_and_rename)

Итак, предполагается, что он выводит в media/<object.pk>/<filename>, если найден первичный ключ, в противном случае он выводит в media/None/<hex-generated-filename>

Если я использую представление post create для загрузки файла, для записи еще не назначен PK, поэтому по умолчанию она принимает значение media/None/<hex-generated-filename>.

Если я затем редактирую сообщение с помощью представления обновления сообщения, файл правильно выводится в media/<object.pk>/<filename>

По сути, проблема в том, что файл загружается до того, как PK будет назначен. Кто-нибудь знает, как это исправить? Вот мои соответствующие мнения:

class PostCreateView(LoginRequiredMixin, FormView):
template_name = 'trucking/post_form.html'
form_class = RecordForm

def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST or None, request.FILES or None)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.author = User.objects.get(username=self.request.user)
        obj.save()
        if self.request.POST.get('Save_Exit'):
            return HttpResponseRedirect('/database/')
        if self.request.POST.get('Save'):
            return HttpResponseRedirect("/post/new")

    return render(request, self.template_name, {'form': form})


class PostUpdateView(LoginRequiredMixin, UpdateView):
form_class = RecordForm
model = Post

def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid(form)

def get_success_url(self):
    if self.request.POST.get('Save_Exit'):
        return reverse('database')
    elif self.request.POST.get('Save'):
        return reverse('post-update', kwargs={'pk': self.object.id})
    else:
        return reverse('database')
Вернуться на верх