Django - Пользовательский файл / Загрузка изображения, получение пути к файлу при загрузке? обрабатывать изображения при загрузке? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть приложение Django, в которое пользователи загружают изображения, а определенные функции используют путь к файлу изображения для их обработки и сохранения результата в той же модели.

все это происходит в представлении загрузки файлапроблема в том, что Мои функции берут путь к файлу, который еще не создан / не зафиксирован в БД, поскольку я не сохраняю их перед вызовом этих функций.

Я попытался переопределить метод сохранения в models.py, и онне работает, так как я могу вызвать функции после загрузки удобным способом ??

вот функция:

# The view for analysing images
def upload_view(request,pk=None):
    patient = get_object_or_404(Patient,pk=pk)
    if request.method == 'POST':
        form = forms.ImageForm(request.POST,request.FILES)
        if form.is_valid():
            image = form.save(commit=False)
            image.patient = patient
            image.enhanced = main(image.original.path)
            image.segmented = segment(image.enhanced.path)
            image.enhanced.name = image.enhanced.path.split('media')[1]
            image.segmented.name = image.enhanced.path.split('media')[1]
            messages.success(request,"Image added successfully!")
            image.save()
            return HttpResponseRedirect(reverse_lazy('patients:patient_detail', kwargs={'pk' : image.patient.pk}))
        else:
            form = forms.ImageForm()
        return render(request, 'patients/upload.html', {'form': form})
    else:
        form = forms.ImageForm()
    return render(request, 'patients/upload.html', {'form': form})

image.original загруженное изображение

проблема в том, что путь к файлу не передан правильно, и функции возвращают ошибки из-за этого. (это работало, когда я выполнял обработку в другом представлении, к которому он был доступен после загрузки)

1 Ответ

1 голос
/ 30 октября 2019

Прежде чем вы вызовете save() для вашей модели, путь к вашему изображению не существует или является временным. Вы можете исправить это, сначала создав модель из формы, не требуя commit=False, при условии, что main и segment являются функциями на основе PIL, которые возвращают изображения, вы можете использовать метод ImageField.save () для установки именив то же время:

if form.is_valid():
    image = form.save() # this creates the model, the upload paths are created here!
    image.patient = patient
    image.enhanced.save("enhanced_" + image.original.name, main(image.original.path)) # I made this up to avoid conflicts in your storage
    image.segmented.save("segmented_" + image.original.name, segment(image.enhanced.path))
    image.save() # this updates the model with the new images
    messages.success(request,"Image added successfully!") # I moved this here, more accurate, in case save fails....
    return HttpResponseRedirect(reverse_lazy('patients:patient_detail', kwargs={'pk' : image.patient.pk}))

Как видите, вам нужно два попадания в базу данных, чтобы сохранить ваши изображения. Это предполагает, что расширенные и сегментированные поля не требуются в модели.

Кроме того, поскольку преобразование изображения является дорогостоящей задачей, я бы проверил, как вывести это из цикла запроса,используя что-то вроде Celery или Django-RQ , таким образом, ваше приложение может по-прежнему обслуживать запрос при выполнении преобразований в фоновом режиме.

...