[python] 다 대다 목록 디스플레이 장고

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그것을 오류를 부여하지 않고?

편집 : 아마도 더 나은 질문은 당신이 표시 어떻게 될 것 ManyToManyField으로 list_display?



답변

직접 할 수 없을 수도 있습니다. 문서에서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')


답변