我为我正在构建的应用构建了一个配置文件驱动的管理员。用户对层次结构树的某些部分具有一些权限(在管理表单中显示为选择),并且我希望在选择中仅显示树的这一部分。我想更改此选择字段的queryset
属性。
表单不了解请求(用户),所以我可以在__init__中查看它。
我已尝试在form.base_fields
中设置ModelAdmin.get_form()
,但我使用此方法产生副作用:某些用户可以看到其他用户的树,并有错误消息,由于许可。避免这些错误的唯一方法是重新加载项目(在Web服务器级别),这不是一个选项......
我还尝试覆盖ModelAdmin.get_fields()
方法,但似乎没有被调用。
有人知道如何做到这一点?
......我会提供一些代码......
管理:
https://gist.github.com/frague59/f90ba63bb2548fb27e32576329159543
形式:
https://gist.github.com/frague59/aa5236eb11982bd810f81342da8bc05d
答案 0 :(得分:0)
听起来您可能正在寻找crosstab
方法。文档中的示例显示了如何基于用户限制字段的查询集:
Func
答案 1 :(得分:0)
我找到了覆盖这些字段的方法:在get_form()方法中使用deepcopy
复制表单类,然后使用base_field
更新字段:
class MyAdmin(ModelAdmin):
form = MyForm # class !
def get_form(self, ...):
self.form = deepcopy(self.form)
form = super(MyAdmin, self).get_form(...)
if 'foo' in form.base_fields:
form.base_fields['foo'].queryset = my_reduced_queryset
form.base_fields['foo'].widget = my_pretty_widget
...
return form
感谢您的帮助!