如何修改Django admin ManyToManyField文本?

时间:2014-11-25 19:49:52

标签: python django admin manytomanyfield

我有“文章”和“模块”应用。在“模块”应用程序中,有一个模型必须显示文章,它们由“模块”中的ManyToManyField链接。

我的问题是如何在Django admin的select字段中修改文本值?默认情况下,它显示文章的名称,但我也想要文章模型中的一些信息。 有没有一种简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:1)

根据您的Python版本,您可能要覆盖模型的__str__字段(Python 3)或模型的__unicode__字段(Python 2)以更改它们的显示方式管理员。

Reference in the Django docs

答案 1 :(得分:0)

Django Admin选择菜单使用模型实例的unicode值来填充菜单之类的内容。无论您的__unicode__方法返回什么,都应该是选择菜单中的内容。

答案 2 :(得分:0)

你的问题很模糊,但我只是假设,你有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)
在管理员中,您会看到多个选择框中每个对象的<object_name> whatever text you want,这是您想要的吗?

答案 3 :(得分:0)

如果要在管理字段中执行此操作,则可以使用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

这来自this answer,它实现了相同的目标,但是使用Form类而不是formfield_for_manytomany