gpt4 book ai didi

django-admin - Django admin - 定义 list_editable 的动态方式

转载 作者:行者123 更新时间:2023-12-04 15:28:22 24 4
gpt4 key购买 nike

我的目标是使某些字段在 ListView 中可编辑。但问题是字段是使用 get_list_display 动态确定的。此外,我想将 list_editable 的元素也定义为动态的。不过,Django好像没有提供get_editable_list这样的方法。是故意的吗?如何实现?

现在我的代码是这样的:

类 MyModelAmdin(admin.ModelAdmin):

list_editable = ('field1')
# change_list_template = "files_changelist.html"

def get_list_display(self, request):
if request.user.is_superuser:
list_display = ('field1', 'field2',)
else:
list_display = ('field1',)
return list_display

Django(有理有据地)提示 list_display 中未包含的某些字段包含在 list_editable 中。有什么办法吗?

最佳答案

好问题!!需要深入研究代码,但是...

Django does not seem to provide any method like get_editable_list

是的,这是正确的。 Django 不提供任何内置方法来执行此操作。

Is it made deliberately ?

我不确定,这可能是一个疏忽,但我怀疑不是。确保list_editable中没有list_display中没有的东西的检查在django启动的一开始就运行,你甚至不能runserver 这个条件。以这种方式检查它的事实,而不是仅仅引发一个正常的错误,让我认为有充分的理由绝对确定这个条件成立。添加动态方式来设置 list_editable 会使这样的检查变得不可能。

How can this be achieved ?

ModelAdmin 中有一些方法使用了 self.list_editable。您可以重新实现它们以使用您自己的 self.get_list_editable(request) 方法。我认为最简单的方法是先覆盖 changelist_view 并设置 list_editable,然后所有其他方法都将使用正确的 list_editable例如:

class MyModelAdmin(admin.modelAdmin):
list_editable=() # so the check passes - or can just omit this line completely

def get_list_editable(self, request):
# whatever you want here

def changelist_view(self, request, extra_context=None):
self.list_editable = self.get_list_editable(request)
return super().changelist_view(request, extra_context)

只需彻底测试并 100% 确保您的 get_list_editableget_list_display 方法不会导致您在 list_editable 中有内容的情况> 不在 list_display 中。

关于django-admin - Django admin - 定义 list_editable 的动态方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61795189/

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