代码之家  ›  专栏  ›  技术社区  ›  MikeN

在django admin中,我想更改在多关系管理小部件中显示外键的方式。

  •  2
  • MikeN  · 技术社区  · 15 年前

    我有很多关系:

    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号,其他地方我只需打印出一个“book”对象,我想显示标题。

    2)对于manytomany,如何使用比multipleselectlist更好的小部件?如何指定改用复选框选择列表?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Gabriel Ross    15 年前

    对于2),请在authoradmin类中使用:

    raw_id_fields = ['books']
    

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

        2
  •  2
  •   leninyee    15 年前

    要显示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
    
    推荐文章