Django admin: Comment afficher un champ marqué comme modifiable = False 'dans le modèle?

99

Même si un champ est marqué comme 'editable=False'dans le modèle, j'aimerais que la page d'administration l'affiche. Actuellement, il cache complètement le champ. Comment y parvenir?

GabiMe
la source

Réponses:

195

Utilisez les champs en lecture seule . Comme ça (pour django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
tback
la source
6
+1. Surtout si vous ne prévoyez pas du tout de modifier le champ dans Admin.
Manoj Govindan
Cela ne fonctionne pas ici (Django 2.0). Le champ ne s'affiche alors pas dans l'interface d'administration.
nerdoc
1
Je viens de créer un exemple d'application pour reproduire votre erreur (django 2.0.8, python 3.5). Cela fonctionne toujours très bien. Peut-être que quelque chose ne va pas dans votre application @nerdoc?
retrouvez le
oups. Tir rapide typique. N'a pas testé, semble être un problème avec mon installation. Merci et désolé.
nerdoc
2
Pour moi, l'administrateur s'est écrasé lorsque je l'ai ajouté fields, mais lorsque je l'ai ajouté, il readonly_fieldsne s'est pas affiché jusqu'à ce que je l'ai ajouté aux deux, puis il est apparu dans l'administrateur.
owenfi
18

Mettre à jour

Cette solution est utile si vous souhaitez que le champ reste modifiable dans Admin mais non modifiable partout ailleurs. Si vous souhaitez que le champ ne soit pas modifiable tout au long, la réponse de @Till Backhaus est la meilleure option.

Réponse originale

Une façon de le faire serait d'utiliser une personnalisation ModelFormdans l'administrateur. Ce formulaire peut remplacer le champ obligatoire pour le rendre modifiable. Ainsi, vous conservez editable=Falsepartout ailleurs sauf Admin. Par exemple (testé avec 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
la source
1
Cela ne fonctionne pas, du moins sur django 1.6. Le formulaire s'affiche correctement dans le panneau d'administration, mais lorsque j'enregistre un formulaire et y retourne à nouveau, la valeur du formulaire est à nouveau par défaut.
Euphorbium
4

Vos champs en lecture seule doivent également figurer dans des champs:

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