在Django Admin中,我想更改多对多关系管理小部件中外键的显示方式
我有一个多对多的关系:
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点可能需要修改管理界面模板来查看作者对象。