Администратор Django, как скрыть конкретное поле модели во время просмотра и редактирования - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть модель django A , эта модель зарегистрирована на администраторе django, откуда пользователь-администратор может добавлять / редактировать данные.

#models.py
class A(models.Model):
    eth_address = models.CharField( max_length=100)
    private_key = encrypt(max_length=100))

Теперь я хочу, чтобы, однаждыданные добавляются в БД, при редактировании или просмотре я не хочу, чтобы поле private_key было видно в пользовательском интерфейсе.

Я попытался использовать следующий фрагмент в admin:

#admin.py
...
 def get_form(self, request, obj=None, **kwargs):
    self.exclude = ("private_key", )
    form = super(AAdmin, self).get_form(request, obj, **kwargs)
    return form
...

Однако,если я открываю модель в режиме редактирования и нажимаю сохранить, она заменяет private_key на NULL в БД, это означает, что это значение не было передано из внешнего интерфейса, что является истинным, поскольку мы исключили поле, однако при сохранении его значение было переопределено наNULL, есть идеи, как это исправить?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Исходя из вашего вопроса, я считаю, что вы хотите, чтобы «private_key» отображался только при создании объекта.

Вы можете переопределить метод get_fields. Если вы хотите, чтобы «private_key» был виден только при создании объекта, вы можете сделать следующее:.

Удалите 'private_key' из list_display, если он у вас есть, и вы также хотите удалить его из списка.Добавьте в list_display, если хотите показать в виде списка.

class AModelAdmin(admin.ModelAdmin):
    list_display = ['eth_address']

    def get_fields(self, request, obj=None):
        fields = super().get_fields(request, obj)
        if obj:
            fields.remove('private_key')
        return fields


admin.site.register(A, AAdmin)
0 голосов
/ 26 февраля 2019

Чтобы сделать поле скрытым, переопределите change_view в классе ModelAdmin и исключите поле

def change_view(self, request, object_id, extra_context=None):
    self.exclude = ('private_key', )
    return super().change_view(request, object_id, extra_context)

Если вы хотите просматривать его только для чтения при редактировании, вы хотите переопределить функцию get_readonly_fields, что-тонапример,

def get_readonly_fields(self, request, obj=None):
    if obj:
        return ['private_key',]
    else: 
        return []

, поэтому вы проверяете, существует ли уже объект obj, что делает это редактированием, и добавляете private_key в поля только для чтения

...