首页 > 解决方案 > 如何覆盖 django 文件?

问题描述

我有一个裁剪用户图像的函数,但我不希望模型有 2 个字段,所以我创建了一个覆盖原始文件的函数,我注意到该函数在普通文件上运行良好,但是当我将该函数添加到视图时制作了新文件,但在媒体目录中甚至没有指定的文件夹,那么我如何通过 Django 覆盖文件?

模型.py

# defining directory for every patient
def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/patient_<id>/<filename>
    return 'patient_{0}/{1}'.format(instance.patient.id, filename)

class UploadedImages(models.Model):
    patient =           models.ForeignKey(Patient,on_delete=models.CASCADE,related_name='images')
    pre_analysed =      models.ImageField(upload_to = user_directory_path ,
                                            verbose_name = 'Image')
    upload_time =       models.DateTimeField(default=timezone.now)

裁剪功能:

import os
from PIL import Image

def crop(corrd, file ,path,pk):

    image = Image.open(file) #To open the image as file.path won't open
    path_1 , fn = os.path.split(path) #which is MEDIA_ROOT/and <filename> 
    patient_dir = 'patient_{}'.format(pk) #to get the user directory
    path_ = path_1+patient_dir+fn #MEDIA_ROOT/patient_<id>/<filename>
    cropped_image = image.crop(corrd)
    resized_image = cropped_image.resize((384, 384), Image.ANTIALIAS)
    resized_image.save(path_)

    return path_

视图.py

if form.is_valid():
            image = form.save(commit=False)
            x = float(request.POST.get('x'))
            y = float(request.POST.get('y'))
            w = float(request.POST.get('width'))
            h = float(request.POST.get('height'))
            print(x)
            print(y)
            print(w)
            print(h)
            crop((x,y,w+x,y+h),image.pre_analysed,image.pre_analysed.path)
            image.patient = patient
            messages.success(request,"Image added successfully!")
            image.save()

表格.py

class ImageForm(ModelForm):
    x = forms.FloatField(widget=forms.HiddenInput())
    y = forms.FloatField(widget=forms.HiddenInput())
    width = forms.FloatField(widget=forms.HiddenInput())
    height = forms.FloatField(widget=forms.HiddenInput())

    class Meta:
        model = UploadedImages
        fields = ('pre_analysed', 'x', 'y', 'width', 'height', )

那么我需要在这里做什么?提前致谢。

标签: pythondjangoimagedjango-modelsdjango-forms

解决方案


您从中获取的路径.path是相对于您的MEDIA_ROOT文件夹的,这可能会阻止您的裁剪功能能够处理open()图像文件。

然后,您可以在 MEDIA_ROOT 的某处制作一个新的裁剪文件。一定要os.makedirs()用来创建这里和文件之间的所有目录。此外,我没有看到您将返回的路径保存crop()ImageField.


推荐阅读