假设我在 Django 1.4 中有一个简单的博客应用程序:
class Post(models.Model):
title = …
published_on = …
tags = models.ManyToManyField('Tag')
class Tag(models.Model):
name = …
即一个帖子有很多标签。在 Django 管理员上,我得到了一个不错的 <select multi>
如果我包括 tags
在 fields
对于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/