【问题标题】:How to modify messages displayed in Admin change page?如何修改管理员更改页面中显示的消息?
【发布时间】:2020-04-17 20:15:30
【问题描述】:

我有一个模型文档,管理员可以将图像上传到 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 在哪里添加了图片已正确上传的正面消息。如何删除它并仅显示未上传重复图像的消息?

谢谢!

标记

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    系统确定表单有效后发送成功消息,在此行: https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1244

    没有很好的方法来挂钩,但我认为这是因为您所做的工作应该真正发生在表单上,​​而不是save_model 函数中。要查看如何在管理员上编辑表单,请查看 here。在该表单的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)
    

    【讨论】:

    • 我正在使用 save_model 方法,因为我允许一次多次上传。我首先想到按照您的建议在 clean 方法中进行重复文件检查,但我不确定我是否使一个文件字段无效,是否会中止其余的上传,我也不知道如何修改如果文件字段在 clean 方法中无效,则上传文件列表。我可以尝试一下,但是多个文件上传似乎与管理员更改页面/清理方法的工作方式背道而驰。您认为我在 save_model 方法中进行文件检查是正确的吗?
    • 另外,您的帖子中没有包含编辑管理表单的链接。你能在评论中添加它吗?
    • 我在添加错误消息之前添加了list(messages.get_messages(request)),但仍然出现“成功保存”消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多