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
私はそのコードを持っています。残念なことに、エラーはadmin.pyにManyToManyField
とともに来ます
class PurchaseOrderAdmin(admin.ModelAdmin):
fields = ['product', 'dollar_amount']
list_display = ('product', 'vendor')
エラーは言います:
'PurchaseOrderAdmin.list_display [0]'、 'product'は、サポートされていないManyToManyFieldです。
ただし、'product'
からlist_display
を取り出すとコンパイルされます。では、エラーを表示せずに'product'
にlist_display
を表示するにはどうすればよいですか?
編集:list_display
にManyToManyField
を表示するにはどうすればよいでしょうか?
直接実行できない場合があります。 list_display
のドキュメントから
ManyToManyFieldフィールドはサポートされていません。テーブルの各行に対して個別のSQLステートメントを実行する必要があるためです。それでもこれを行うには、モデルにカスタムメソッドを指定し、そのメソッドの名前をlist_displayに追加します。 (list_displayのカスタムメソッドの詳細については、以下を参照してください。)
次のようなことができます:
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()])
または、モデルメソッドを定義し、それを使用します
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()])
そして、管理者list_display
list_display = ('get_products', 'vendor')
このようにして、次のスニペットを確認してください。
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)
そして、次のようにadmin.pyモジュール呼び出しメソッドで:
class categories(admin.ModelAdmin):
list_display = ('title', 'get_parents', 'when')