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, тоже не работает.
Что мне нужно:
- Для list_display, я просто хочу, чтобы админ мог видеть размер товара как колонку в таблице Product в панели администратора.
- Для набора полей, я хочу, чтобы админ мог выбирать размеры для каждого товара (может быть несколько) .
Спасибо!
Я полагаю, что вам придется добавить 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
...я не уверен, я всегда называл его по-другому.