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?

Réponses:


195

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

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)

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)

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')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.