gpt4 book ai didi

python - 在 django-admin 中,如何将 filter_horizo​​ntal 设置为默认值?

转载 作者:太空狗 更新时间:2023-10-30 01:17:00 25 4
gpt4 key购买 nike

django-admin 中 ManyToManyFields 的默认小部件很难使用。我可以在各个字段上设置 filter_horizo​​ntal 并获得更好的小部件。

如何将 filter_horizo​​ntal 设置为所有 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_horizo​​ntalfilter_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_horizo​​ntal 设置为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8697146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com