Как изменить сообщения, отображаемые на странице изменения администратора? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть модель документа, и администратор может загрузить изображение в 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)

Полученная страница администратора с двумя сообщениями, когда я пытаюсь загрузить дублированное изображение: The two messages on the admin page when a duplicate image is uploaded

Я не уверен, где Django добавляет положительное сообщение о том, что изображение было загружено правильно. Как мне go удалить его и просто отобразить сообщение о том, что дублированное изображение не было загружено?

Спасибо!

Отметить

1 Ответ

0 голосов
/ 18 апреля 2020

Сообщение об успешной отправке отправляется после того, как система определит, что форма действительна, в этой строке: https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1244

Там нет хорошего способа подключиться, но Я думаю, это потому, что работа, которую вы выполняете, должна выполняться в форме, а не в функции save_model. Чтобы узнать, как редактировать форму в админке, посмотрите здесь . В методе 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)
...