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

时间:2009-09-18 14:27:14

标签: python django django-admin django-widget

我有一个ManyToMany关系:

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)如何为ManyToMany使用比MultipleSelectList更好的小部件。我怎样才能指定使用CheckBoxSelectList呢?

2 个答案:

答案 0 :(得分:2)

要显示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

答案 1 :(得分:1)

For 2),在AuthorAdmin类中使用它:

raw_id_fields = ['books']

点击此处:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin了解有关创建自定义ModelAdmin类的说明。我自己为我自己的Django项目考虑了很多,我认为1)需要修改管理模板来查看Author对象。