- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
django-admin 中 ManyToManyFields
的默认小部件很难使用。我可以在各个字段上设置 filter_horizontal
并获得更好的小部件。
如何将 filter_horizontal
设置为所有 ManyToManyFields
的默认值?
(当然,我也会对 filter_vertical
感到满意。)
我四处搜索解决方案,但在 Google 或 SO 上没有找到任何内容。我可以想到如何通过一些元编程来做到这一点,但如果有人已经这样做了或者如果它在 Django 的某个地方,我很想听听。
最佳答案
修改现有代码中定义的类的最佳方法是使用 mixin .需要修改ModelAdmin
类的formfield_for_manytomany
方法;该方法是 defined in BaseModelAdmin
.
在 Django 服务器启动时保证运行的模块中添加以下代码 [您自己的应用程序之一的 models.py
]:
from django.contrib.admin.options import ModelAdmin
from django.contrib.admin import widgets
class CustomModelAdmin:
def formfield_for_manytomany(self, db_field, request=None, **kwargs):
"""
Get a form Field for a ManyToManyField.
"""
# If it uses an intermediary model that isn't auto created, don't show
# a field in admin.
if not db_field.rel.through._meta.auto_created:
return None
db = kwargs.get('using')
if db_field.name in self.raw_id_fields:
kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel, using=db)
kwargs['help_text'] = ''
else:
kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, False) # change second argument to True for filter_vertical
return db_field.formfield(**kwargs)
ModelAdmin.__bases__ = (CustomModelAdmin,) + ModelAdmin.__bases__
注意(2019 年 8 月 27 日):
我完全了解子类化/继承的工作原理,这是解决此类问题的最佳实践。但是,正如我在下面的评论中重申的那样,子类化不会像声明的那样解决 OP 的问题,即。使 filter_horizontal
或 filter_vertical
成为默认值。使用子类化,您不仅需要为所有模型注册您的子类,您还必须取消注册在您安装的内置 Django 应用程序和第三方应用程序中注册的每个 ModelAdmin 子类,然后注册您的新 ModelAdmin 子类。因此,例如对于 Django 的内置用户模型 ...
admin.site.unregister(User)
class CustomModelAdmin(admin.ModelAdmin):
""" Add your changes here """
admin.site.register(User, CustomModelAdmin)
...然后对所有已安装的 Django 应用程序和第三方应用程序重复类似的代码。我不认为这是 OP 想要的,因此我的回答。
关于python - 在 django-admin 中,如何将 filter_horizontal 设置为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8697146/
我是一名优秀的程序员,十分优秀!