Skip to main content
 首页 » 编程设计

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

2024年09月03日25itcoder

我有一个多对多关系:

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...) 

在 Author 的管理界面中,我得到一个使用 unicode 显示书籍的多选列表。我想通过两种方式更改列表:

1) 仅在管理界面我想显示 ISBN 号,在其他地方我只是打印出一个“书”对象我想显示标题。

2) 对于 ManyToMany,我怎么能使用比 MultipleSelectList 更好的小部件。我如何指定改用 CheckBoxSelectList?

请您参考如下方法:

要显示 ISBN,您可以创建一个自定义字段,如下所示:

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

有一个 CheckboxSelectMultiple对于 ManyToManyField,但它在管理员上显示不正确,因此您也可以编写一些 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