小部件的名称是 FilteredSelectMultiple,您必须在管理视图中覆盖 formfield_for_manytomany 方法。这是我用过的。
我有一个 Company 模型,其中包含多个课程字段,其中 Member 作为中间模型。
class Company(models.Model):
courses = models.ManyToManyField('courses.Course', through='Member', related_name='companies')
class Member(models.Model):
user = models.OneToOneField(get_user_model(),
related_name="%(app_label)s_%(class)s",
on_delete=models.CASCADE,
)
organization = TenantForeignKey(
Company, related_name="organization_users", on_delete=models.CASCADE)
这是我的管理员视图
class CompanyAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request, **kwargs):
db = kwargs.get('using')
if db_field.name == 'courses':
kwargs['widget'] = FilteredSelectMultiple(
db_field.verbose_name, is_stacked=False
)
else:
return super().formfield_for_manytomany(db_field, request, **kwargs)
if 'queryset' not in kwargs:
queryset = Course.objects.filter(is_active=True)
if queryset is not None:
kwargs['queryset'] = queryset
form_field = db_field.formfield(**kwargs)
msg = 'Hold down “Control”, or “Command” on a Mac, to select more than one.'
help_text = form_field.help_text
form_field.help_text = (
format_lazy('{} {}', help_text, msg) if help_text else msg
)
return form_field