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

发布于 2024-08-05 17:29:44 字数 486 浏览 3 评论 0原文

我有一个多对多关系:

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 来代替?

I have a ManyToMany relationship:

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

In the admin interface for Author I get a multiple select list that uses the unicode display for books. I want to change the list in two ways:

1) Only for the admin interface I want to display the ISBN number, everywhere else I just print out a "Book" object I want the title displayed.

2) How could I use a better widget than MultipleSelectList for the ManyToMany. How could I specify to use a CheckBoxSelectList instead?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怪我太投入 2024-08-12 17:29:44

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

To display the ISBN you could make a custom field like this:


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

There's a CheckboxSelectMultiple for the ManyToManyField but it doesn't display correctly on the admin, so you could also write some css to fix that.

You need to create a form for the model, and use that in your admin class:


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
◇流星雨 2024-08-12 17:29:44

对于 2),在您的 AuthorAdmin 类中使用它:

raw_id_fields = ['books']

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

For 2), use this in your AuthorAdmin class:

raw_id_fields = ['books']

Check here: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin for instructions on creating a custom ModelAdmin class. I've thought about this a lot myself for my own Django project, and I think 1) would require modifying the admin template for viewing Author objects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文