Переименование загруженных файлов с помощью первичных ключей 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')