如何修改 Django 管理员 ManyToManyField 文本



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

我的问题是如何修改 Django 管理员中选择字段中的文本值?默认情况下,它显示文章的名称,但我也希望在此处从文章模型中获取一些信息。有没有简单的方法可以做到这一点?

根据您的 Python

版本,您需要覆盖模型的__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

相关内容

  • 没有找到相关文章

最新更新