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?
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
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', )
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