Django admin list : как указать пользовательское поле вместо метода модели __str__?
У меня есть модель, которая имеет несколько атрибутов, отображаемых в методе __str__
. Я хочу отобразить только атрибут name в списке администратора. Как мне добиться этого, не переопределяя __str__
? В примере ниже я пытался использовать list_display
в модели администратора, но Django все равно отображает атрибуты в __str__
, определенном для модели.
models.py:
class Product(models.Model):
"""
Product
"""
id = models.PositiveBigIntegerField(primary_key=True)
attributes = models.JSONField()
labels = models.JSONField()
name = models.TextField()
relative_url = models.TextField()
image = models.URLField()
delivery = models.TextField()
online = models.BooleanField()
is_customizable = models.BooleanField()
is_exclusive = models.BooleanField()
url = models.TextField()
max_price = models.PositiveIntegerField()
min_price = models.PositiveIntegerField()
currency = models.ForeignKey(Currency, on_delete=models.CASCADE)
discount_percentage = models.PositiveSmallIntegerField(default=0)
recommended_retail_price = models.PositiveIntegerField()
def __str__(self) -> str:
product_str = (
f"id: {self.id}\n"
f"attributes: {self.attributes}\n"
f"labels: {self.labels}\n"
f"name: {self.name}\n"
f"relative_url: {self.relative_url}\n"
f"image: {self.image}\n"
f"delivery: {self.delivery}\n"
f"online: {self.online}\n"
f"is_customizable: {self.is_customizable}\n"
f"is_exclusive: {self.is_exclusive}\n"
f"url: {self.url}\n"
f"max_price: {self.max_price}\n"
f"min_price: {self.min_price}\n"
f"currency: {self.currency}\n"
f"discount_percentage: {self.discount_percentage}\n"
f"recommended_retail_price: {self.recommended_retail_price}\n"
)
return product_str
def get_absolute_url(self) -> str:
return reverse("web:product-detail", args=[self.id])
class Meta:
db_table = "product"
ordering = ["recommended_retail_price"]
admin.py:
class ProductAdmin(admin.ModelAdmin):
list_display = ("name",)
form = ProductForm
forms.py:
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = "__all__"
Вы также можете настроить отображение администратора вашей модели, используя следующие способы:
class ProductAdmin(admin.ModelAdmin):
list_display = ("get_name",)
form = ProductForm
def get_name(self, obj):
return obj.name # here you can do whatever you want
Решено. Я использовал стандартные формы администратора для моделей и не регистрировал явно свои формы администратора. Я обновил свой admin.py, чтобы явно зарегистрировать свои модели администраторов, например:
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ("id", "name", "recommended_retail_price", "currency")
list_per_page = 10
form = ProductForm