Lorsque j'ai spécifié la colonne ManyToManyField dans list_display de admin.py, j'ai eu l'erreur suivante.
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
<class 'proj.admin.ArticleAdmin'>: (admin.E109) The value of 'list_display[2]' must not be a ManyToManyField.
J'ai pensé qu'il serait pratique de pouvoir lister les données d'une autre table liée à ManyToManyField pour un certain enregistrement sur le site de gestion, mais il semble que la spécification ne puisse pas être spécifiée en fonction du message d'erreur.
Cependant, c'était possible en faisant ce qui suit, donc je vais enregistrer la méthode.
Imaginez un exemple où des métadonnées sont ajoutées à un document, tel que Hatena Bookmark.
Supposons que vous ayez trois auteurs, un article et une balise.
Article.meta est ManyToManyField et Tag est spécifié comme destination de la relation.
models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey('Author', blank=True, null=True)
meta = models.ManyToManyField('Tag')
def __unicode__(self):
return self.title
class Tag(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
admin.py
En définissant une fonction avec un nom arbitraire tel que _meta et en spécifiant le nom de la fonction correspondante dans list_display, il était possible de lister les données liées par des virgules comme indiqué dans la figure ci-dessus.
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', '_meta')
def _meta(self, row):
return ','.join([x.name for x in row.meta.all()])
admin.site.register(Article, ArticleAdmin)
Recommended Posts