web-dev-qa-db-fra.com

Comment masquer certains champs dans Django-admin?

class Book(models.Model):
    title = models.CharField(..., null=True)
    type = models.CharField(...)
    author = models.CharField(...)

J'ai une classe simple dans models.py. Dans admin, je voudrais masquer le titre du livre (sous la forme de détails du livre) lorsque le type du livre enregistré est 1. Comment procéder de la manière la plus simple?

49
pmoniq

Vous devez créer admin.py dans votre module (probablement book)

class BookAdmin(admin.ModelAdmin):
    list_display = ("pk", "get_title_or_nothing")

Dans Livre classe:

class Book:
    ...
    def get_title_or_nothing(self):
        if self.type == WEIRD_TYPE:
            return ""
        return self.title

MISE À JOUR:

class BookAdmin(admin.ModelAdmin):
    list_display = ("pk", "get_title_or_nothing")

    def get_form(self, request, obj=None, **kwargs):
        if obj.type == "1":
            self.exclude = ("title", )
        form = super(BookAdmin, self).get_form(request, obj, **kwargs)
        return form
18
Aleksej Vasinov

Pour Django> 1.8, on peut définir directement les champs à exclure dans admin:

 class PostCodesAdmin(admin.ModelAdmin):
      exclude = ('pcname',)

Les champs masqués sont directement définis dans l'ORM de Django en définissant l'attribut Field: editable = False

par exemple.

class PostCodes(models.Model):
  gisid  = models.IntegerField(primary_key=True)
  pcname = models.CharField(max_length=32, db_index=True, editable=False)
  ...

Cependant, la définition ou la modification directe des champs du modèle peut ne pas toujours être possible ou avantageuse. En principe, les admin.py la configuration pourrait fonctionner, mais ne fonctionnera pas puisque exclure est une option InlineModelAdmin.

class PostCodesAdmin(admin.ModelAdmin):
     exclude = ('pcname',)
....

Une solution fonctionnant au moins dans Django 1.4 (et probablement les numéros de version ultérieurs) est:

class PostCodesAdmin(admin.ModelAdmin):
  def get_form(self, request, obj=None, **kwargs):
      form = super(PostCodesAdmin, self).get_form(request, obj, **kwargs)
      del form.base_fields['enable_comments'] 
      return form

Pour la liste d'administration des éléments, il suffit de laisser de côté les champs non requis: par ex.

class PostCodesAdmin(admin.ModelAdmin):
  list_display = ('id', 'gisid', 'title', )
106
Lorenz Lo Sauer

Apropos @Lorenz @mrts réponse

avec Django 2.1 J'ai trouvé que l'exclusion ne fonctionne pas si le champ est déjà spécifié via champs =.

Dans ce cas, vous pouvez utiliser

self.fields.remove('title')

les champs devront être définis comme une liste [] pour que cela fonctionne

0
mb_atx