Django admin.py fieldsets: Как добавить поле из поля ManyToMany внутри fieldsets?

У меня есть эти 2 модели:

class Size(models.Model):
    _id = models.AutoField(primary_key=True, editable=False)
    size = models.CharField(max_length=50, null=True, blank=False)

    SIZE_TYPES = (
      ('XS', 'XS'),
      ('S', 'S'),
      ('M', 'M'),
      ('L', 'L'),
      ('XL', 'XL'),
      ('XXL', 'XXL'),
    )
    size_type           = models.CharField(max_length=10, choices=SIZE_TYPES, null=True, blank=True)

    GENDERS = (
    ('M', 'Male'),
    ('F', 'Female'),
    ('U', 'Unisex'),
)
    gender = models.CharField(max_length=50, choices=GENDERS, null=True, blank=False)


    def __str__(self) -> str:
        return f'{self.size} ({self.size_type}) - {self.gender}'

и:

class Product(models.Model):
    _id = models.AutoField(primary_key=True, editable=False) 
    user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True) 
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True) 
    size = models.ManyToManyField(Size)
    (... other attributes)

и в моем admin.py я хочу, чтобы ProductAdmin имел атрибуты Size на своих наборах полей и на listdisplay, но это не работает

Итак, мой ProductAdmin выглядит следующим образом:

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):

fieldsets = [
    ('General Info', {
        'fields': [
            'user', 'name', 'model', 'colorway', 'condition', 'currency', 'price', 'stock', 'description', 
        ]
    }),
    
    ('Size', {
        'fields': [
           'size', 'size_type', 'gender', 
       ]
    }),
    ("Relationship", {
        'fields':[
        'brand', 'category'
        ]
    }),
    ('Image',{
        'fields':[
            'image'
        ]
    }),
    ('Other info',{
        'fields':[
            'rating', 'numReviews'
        ]
    }),
    
    
]

list_display = ['_id','name', 'brand', 'price', 'stock', 'category','rating','user','size']

Но я не могу заставить его работать, я пробовал также size__size, тоже не работает.

Что мне нужно:

  1. Для list_display, я просто хочу, чтобы админ мог видеть размер товара как колонку в таблице Product в панели администратора.
  2. Для набора полей, я хочу, чтобы админ мог выбирать размеры для каждого товара (может быть несколько)
  3. .

Спасибо!

Я полагаю, что вам придется добавить Custom Admin Column. Это имеет смысл, потому что Django не знает, как представить Many-To-Many самостоятельно

size_string
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ['_id','name', 'brand', 'price', 'stock', 'category','rating','user','size_string']

    def size_string(self, obj):
        s = ''
        for i in obj.size.all():
            s += i.size +', '
        return s

Примечание: возможно, вы сможете вызвать функцию + столбец size вместо size_string ...я не уверен, я всегда называл его по-другому.

Вернуться на верх