我有"文章"和"模块"应用程序。 在"模块"应用程序中,有一个模型必须显示文章,它们由"模块"中的ManyToManyField链接。
我的问题是如何修改 Django 管理员中选择字段中的文本值?默认情况下,它显示文章的名称,但我也希望在此处从文章模型中获取一些信息。有没有简单的方法可以做到这一点?
版本,您需要覆盖模型的__str__
字段(Python 3),或者模型的__unicode__
字段(Python 2)以更改它们在管理员中的显示方式。
Django 文档中的参考
Django Admin 选择菜单使用模型实例的 unicode 值来填充菜单等内容。无论您__unicode__
方法返回什么,都应该是选择菜单中的内容。
你的问题很模糊,但我只是假设,你有Article
模型,它有很多对多的字段,例如 Something
模型
class Something(models.Model):
name = models.CharField(max_length=10)
#...
def __unicode__(self):
return u"{} whatever text you want".format(self.name)
class Article(models.Model):
title = models.CharField(max_length=120)
something = models.ManyToMany(Something)
def __unicode__(self):
return u"{}".format(self.title)
在 admin 中,您将在多选框中看到每个对象的<object_name> whatever text you want
,这是您想要的吗?
为管理字段执行此操作,可以使用formfield_for_manytomany
。 在骨架形式中,它可能看起来像这样:
def formfield_for_manytomany(self, db_field, request=None, **kwargs):
field = super().formfield_for_manytomany(db_field, request, **kwargs)
if db_field.name in ['the_field_you_want']:
# This line answers the question.
field.label_from_instance = lambda obj: "{}".format(obj.what_you_want_to_see)
# The lines below included so folks know you can
# also modify queryset and widget in this method
field.widget = forms.CheckboxSelectMultiple() # checkboxes
field.queryset = field.queryset.filter(some_field = something)
return field #important
这来自这个答案,它实现了相同的目标,但使用Form
类而不是formfield_for_manytomany
。