我有一个模型文档,管理员可以将图像上传到FileField。成功上传文档/图像后,我还将保存图像的sha256“指纹”以测试管理员是否尝试上传重复的图像。如果检测到重复图像,我不会保存重复图像,而是通过消息框架向管理员显示错误消息。但是,我也收到消息,说文档已成功上传。如何防止这种情况发生?
我的缩写代码:
class Document(Model):
document_id = models.AutoField(primary_key=True)
computed_sha256 = models.CharField(editable=False, max_length=64, default="foobar")
storage_file_name = models.FileField('File name', upload_to=settings.DOCUMENT_FOLDER_ORIGINALS, default=settings.DEFAULT_IMAGE_XXXLARGE_PATH,)
class DocumentAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if form.is_valid():
if not change:
# Uploading one or more images
files = request.FILES.getlist('storage_file_name')
if files:
for f in files:
# Check if this file has been uploaded before by checking the fingerprint
_file = form.cleaned_data["storage_file_name"]
sha256 = image_processing_utils.compute_sha256(_file)
duplicate_files = Document.objects.filter(computed_sha256 = sha256)
if len(duplicate_files) > 0:
messages.add_message(request, messages.WARNING, 'Uploading a duplicate of "%s" and it will not be saved' % f.name)
break;
# more image processing stuff
else:
# some more image processing stuff
obj.metadata = form.cleaned_data['metadata']
super().save_model(request, obj, form, change)
我不确定Django在哪里添加了肯定的消息,表示图像已正确上传。我该如何删除它并只显示未上传重复图像的消息?
谢谢!
标记
在系统确定表单有效后,将在以下行上发送成功消息:https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1244
没有一个很好的方法可以挂在那里,但是我认为这是因为您正在做的工作应该确实在表单上而不是在save_model
函数中进行。要查看如何在admin上编辑表单,请查看[here] [1]。在该窗体的clean
方法上,您应该能够完成上述save_model
方法中正在执行的所有操作。
另一种选择是在发布警告消息之前清空您的消息。因此,您将拥有:
# Remove unnecessary success message
list(messages.get_messages(request))
messages.add_message(request, messages.WARNING, 'Uploading a duplicate of "%s" and it will not be saved' % f.name)