Как отобразить значение там, где его нет в админке Django? - PullRequest
3 голосов
/ 21 ноября 2011

Существует ли 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)

Снимок экрана полей какотображается администратор: Screenshot of admin with readonly package fields

1 Ответ

5 голосов
/ 21 ноября 2011

Происходит то, что вы фактически сохраняете пустую строку '' в ваших полях 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..
...