Как отобразить значение там, где его нет в админке Django?

Есть ли djangtastic способ отображения значения по умолчанию в админке, когда его нет? Как 'n/a', но не для того, чтобы сохранить это в базе данных?

Когда я установил все поля в приведенной ниже модели только для чтения в админке, внешний интерфейс выглядит как изображение внизу. Это кажется визуально свернутым, как будто оно должно иметь значение или поле или что-то в этом роде. Если нет простого способа сделать то, что я ищу, то есть ли другое решение, чтобы сделать интерфейс администратора более понятным для пользователя?

class Package(models.Model):
    packaging_format = models.CharField(max_length=40)
    package_delivery_pattern = models.CharField(max_length=30, blank=True)
    package_delivery_comments = models.CharField(max_length=250, blank=True)
    package_manifest_filename = models.CharField(max_length=50)
    package_description = models.CharField(max_length=250, blank=True)
    package_naming_pattern = models.CharField(max_length=50)

Скриншот полей, отображаемых администратором:Снимок экрана администратора с полями пакета только для чтения

1 ответ

Решение

Происходит то, что вы на самом деле сохраняете пустую строку '' в ваших CharFields вместо None значения (из-за blank=True). Таким образом, Django-admin показывает строку, которую вы сохранили в БД (в данном случае ничего).

Если вы измените свои CharFields на null=True вместо blank=True, вы будете экономить NULL в вашей базе данных вместо пустой строки. И таким образом, вы получите поведение, которое вы хотите.

РЕДАКТИРОВАТЬ: я знаю, что это решение не рекомендуется (после Django Docs), но это поведение, которое вы хотели. Django-admin просто показывает вам строку в базе данных, которая '',

Другое решение, которое приходит мне в голову, - это изменить ModelAdmin для вашего Package модель, что-то вроде:

class PackageAdmin(admin.ModelAdmin):
    readonly_fields = ['show_package_delivery_pattern', ...]

    def show_package_delivery_pattern(self, obj):
        if obj.package_delivery_pattern:
            return obj.package_delivery_pattern
        else:
            return 'N/A'
    # same with all your CharFields..

Начиная с Django 1.9 вы можете использовать empty_value_display на уровне сайта, модели или поля в админке Django. На уровне модели:

class YourModelAdmin(admin.ModelAdmin):
    empty_value_display = '---'
Другие вопросы по тегам