在Django Admin中,我想更改多对多关系管理小部件中外键的显示方式

3 投票
2 回答
2021 浏览
提问于 2025-04-15 14:25

我有一个多对多的关系:

class Book:
  title = models.CharField(...)
  isbn = models.CharField(...)

  def unicode(self):
    return self.title

  def ISBN(self):
    return self.isbn

class Author:
  name = models.CharField(...)
  books = models.ManyToManyField(Book...)

在作者的管理界面中,我看到一个多选列表,这个列表用的是书籍的Unicode显示。我想从两个方面来改变这个列表:

1) 只在管理界面中,我想显示ISBN号码,而在其他地方我只想显示“书籍”对象的标题。

2) 我想用比多选列表更好的控件来处理这个多对多的关系。我该怎么指定使用复选框列表呢?

2 个回答

3

要显示ISBN,你可以像这样创建一个自定义字段:


class BooksField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return obj.isbn

对于ManyToManyField,有一个叫做CheckboxSelectMultiple的选项,但在管理后台显示得不太好,所以你也可以写一些CSS来修复这个问题。

你需要为模型创建一个表单,并在你的管理类中使用它:


class AuthorForm(forms.ModelForm):
    books = BooksField(Book.objects.all(), widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Author

    class Media:
        css = {
            'all': ('booksfield.css',)
        }

class AuthorAdmin(admin.ModelAdmin):
    form = AuthorForm
2

对于第2点,在你的AuthorAdmin类中使用这个:

raw_id_fields = ['books']

可以在这里查看:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin,这里有关于如何创建自定义ModelAdmin类的说明。我自己也考虑过这个问题,尤其是在我的Django项目中,我觉得第1点可能需要修改管理界面模板来查看作者对象。

撰写回答