Django admin: Como exibir um campo marcado como editável = False 'no modelo?

99

Mesmo que um campo esteja marcado como 'editable=False'no modelo, gostaria que a página de administração o exibisse. Atualmente ele esconde o campo por completo. Como isso pode ser feito?

GabiMe
fonte

Respostas:

195

Use campos somente leitura . Assim (para django> = 1,2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
tback
fonte
6
+1. Especialmente se você não planeja editar o campo no Admin.
Manoj Govindan
Isso não funciona aqui (Django 2.0). O campo não é exibido na interface de administração.
nerdoc
1
Acabei de criar um aplicativo de amostra para reproduzir seu erro (django 2.0.8, python 3.5). Isso ainda funciona bem. Talvez algo mais esteja errado em seu app @nerdoc?
tback de
oops. Tiro rápido típico. Não testei, parece haver um problema com a minha instalação. Obrigado e desculpe.
nerdoc
2
Para mim, o admin travou quando eu adicionei fields, mas quando eu adicionei ele readonly_fieldsnão apareceu até que eu o adicionei a ambos e então apareceu no admin.
owenfi
18

Atualizar

Esta solução é útil se você deseja manter o campo editável no Admin, mas não editável em qualquer outro lugar. Se você quiser manter o campo não editável o tempo todo , a resposta de @Till Backhaus é a melhor opção.

Resposta Original

Uma maneira de fazer isso seria usar um custom ModelFormno admin. Este formulário pode substituir o campo obrigatório para torná-lo editável. Assim, você mantém em editable=Falsetodos os outros lugares, exceto Admin. Por exemplo (testado com Django 1.2.3)

# models.py
class FooModel(models.Model):
    first = models.CharField(max_length = 255, editable = False)
    second  = models.CharField(max_length = 255)

    def __unicode__(self):
        return "{0} {1}".format(self.first, self.second)

# admin.py
class CustomFooForm(forms.ModelForm):
    first = forms.CharField()

    class Meta:
        model = FooModel
        fields = ('second',)

class FooAdmin(admin.ModelAdmin):
    form = CustomFooForm

admin.site.register(FooModel, FooAdmin)
Manoj Govindan
fonte
1
Isso não funciona, pelo menos no django 1.6. O formulário é exibido corretamente no painel de administração, mas quando eu salvo um formulário e volto a ele novamente, o valor do formulário é o padrão novamente.
Euphorbium
4

Seus campos somente leitura devem estar em campos também:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
Gabriel
fonte