python - 在 Django Admin 中将 ManyToManyWidget 添加到 ManyToManyField 的反面

标签 python django django-models django-admin

假设我在 Django 1.4 中有一个简单的博客应用程序:

class Post(models.Model):
    title = …
    published_on = …
    tags = models.ManyToManyField('Tag')

class Tag(models.Model):
    name = …

即一个帖子有很多标签。在 Django 管理员上,我得到了一个不错的 <select multi>如果我包括 tagsfields对于PostAdmin .有没有一种简单的方法可以在 <select multi> 中包含帖子列表(作为简单的 TagAdmin ) ?我试着把 fields = ['name', 'posts']TagAdmin并得到了 ImproperlyConfigured错误。 (post_set 的结果相同)。

我对 Django 没问题,所以可以创建一个适当的 AdminForm 和 Admin 对象,但我希望有一个 Right Way™ 来做。

最佳答案

这可以通过自定义表单来实现。

from django.contrib import admin
from django import forms

from models import Post, Tag

class PostAdminForm(forms.ModelForm):
    tags = forms.ModelMultipleChoiceField(
        Tag.objects.all(),
        widget=admin.widgets.FilteredSelectMultiple('Tags', False),
        required=False,
    )

    def __init__(self, *args, **kwargs):
        super(PostAdminForm, self).__init__(*args, **kwargs)
        if self.instance.pk:
            self.initial['tags'] = self.instance.tags.values_list('pk', flat=True)

    def save(self, *args, **kwargs):
        instance = super(PostAdminForm, self).save(*args, **kwargs)
        if instance.pk:
            instance.tags.clear()
            instance.tags.add(*self.cleaned_data['tags'])
        return instance

class PostAdmin(admin.ModelAdmin):
    form = PostAdminForm

admin.site.register(Post, PostAdmin)

如果您想要垂直堆叠的小部件,可以将其中的 False 替换为 True

关于python - 在 Django Admin 中将 ManyToManyWidget 添加到 ManyToManyField 的反面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9879687/

相关文章:

Django 没有外键...但它是一个 ManyToManyField

python - “方法”对象不能通过从读取方法调用分割线来迭代

google-app-engine - 如何在不丢失现有实体的情况下将实体模型更改为多模型?

python - Django中null=True和blank=True有什么区别?

python - 如何在 Django 模型中存储复数

python - 如何从 CSV 文件中查找最早和最新日期 [Python]

python - Microsoft Teams Python Botbuilder 主动消息传递

python - 替换类的列表元素

python - 如何获取倒数第二个元素?

django - reddit 风格的 Django 投票