through one many list_display example python django django-admin admin django-queryset

python - one - many-to-many en la pantalla de lista django



many to many filter django (2)

De esta manera puede hacerlo, amablemente revise el siguiente fragmento:

class Categories(models.Model): """ Base category model class """ title = models.CharField(max_length=100) description = models.TextField() parent = models.ManyToManyField(''self'', default=None, blank=True) when = models.DateTimeField(''date created'', auto_now_add=True) def get_parents(self): return ",".join([str(p) for p in self.parent.all()]) def __unicode__(self): return "{0}".format(self.title)

Y en su método de llamada al módulo admin.py de la siguiente manera:

class categories(admin.ModelAdmin): list_display = (''title'', ''get_parents'', ''when'')

class PurchaseOrder(models.Model): product = models.ManyToManyField(''Product'') vendor = models.ForeignKey(''VendorProfile'') dollar_amount = models.FloatField(verbose_name=''Price'') class Product(models.Model): products = models.CharField(max_length=256) def __unicode__(self): return self.products

Tengo ese código. Desafortunadamente, el error viene en admin.py con "ManyToManyField"

class PurchaseOrderAdmin(admin.ModelAdmin): fields = [''product'', ''dollar_amount''] list_display = (''product'', ''vendor'')

El error dice "''PurchaseOrderAdmin.list_display [0]'', ''product'' es un ManyToManyField que no es compatible."

Sin embargo, se compila cuando saco ''producto'' de list_display. Entonces, ¿cómo puedo mostrar ''producto'' en list_display sin darle errores?

editar: ¿Quizás una mejor pregunta sería cómo mostrar un ManyToManyField en list_display?


Es posible que no puedas hacerlo directamente. De la documentación de list_display

Los campos ManyToManyField no son compatibles, porque eso implicaría ejecutar una instrucción SQL separada para cada fila en la tabla. No obstante, si desea hacer esto, proporcione a su modelo un método personalizado y agregue el nombre de ese método a list_display. (Consulte a continuación para obtener más información sobre métodos personalizados en list_display).

Puedes hacer algo como esto:

class PurchaseOrderAdmin(admin.ModelAdmin): fields = [''product'', ''dollar_amount''] list_display = (''get_products'', ''vendor'') def get_products(self, obj): return "/n".join([p.products for p in obj.product.all()])

O define un método modelo y usa eso

class PurchaseOrder(models.Model): product = models.ManyToManyField(''Product'') vendor = models.ForeignKey(''VendorProfile'') dollar_amount = models.FloatField(verbose_name=''Price'') def get_products(self): return "/n".join([p.products for p in self.product.all()])

y en el administrador list_display

list_display = (''get_products'', ''vendor'')