python - 如何覆盖 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', )
那么我需要在这里做什么?提前致谢。
解决方案
您从中获取的路径.path
是相对于您的MEDIA_ROOT
文件夹的,这可能会阻止您的裁剪功能能够处理open()
图像文件。
然后,您可以在 MEDIA_ROOT 的某处制作一个新的裁剪文件。一定要os.makedirs()
用来创建这里和文件之间的所有目录。此外,我没有看到您将返回的路径保存crop()
到ImageField
.
推荐阅读
- java - 在 Maven 存储库中找不到 SpringSecurityUser 类
- javascript - 使用 JS (DOM) 选择元素时遇到问题
- javascript - 如何通过变量将 JSON 传递给 highchart 热图数据标签?
- c++ - 错误:行外构造函数不能有模板参数 C++
- android - 单击另一个文件中的提交按钮后如何禁用文件中的卡片视图
- asp.net - 使用 Linq 中的 contains 子句从 Dynamics 获取 CRM 联系人
- laravel - 在 Laravel 中结合 selectRaw 和 paginate
- mysql - 如何更改 where 条件以从其他数据库表中读取数字?
- opendaylight - OpenDaylight 不会从 netconf 设备读取 hello 消息
- awk - 变得致命:在两个文件之间创建连接时尝试使用标量值作为数组错误