管理员覆盖表单字段属性

时间:2017-05-26 07:03:35

标签: django django-admin

我为我正在构建的应用构建了一个配置文件驱动的管理员。用户对层次结构树的某些部分具有一些权限(在管理表单中显示为选择),并且我希望在选择中仅显示树的这一部分。我想更改此选择字段的queryset属性。

表单不了解请求(用户),所以我可以在__init__中查看它。

我已尝试在form.base_fields中设置ModelAdmin.get_form(),但我使用此方法产生副作用:某些用户可以看到其他用户的树,并有错误消息,由于许可。避免这些错误的唯一方法是重新加载项目(在Web服务器级别),这不是一个选项......

我还尝试覆盖ModelAdmin.get_fields()方法,但似乎没有被调用。

有人知道如何做到这一点?

......我会提供一些代码......

管理:

https://gist.github.com/frague59/f90ba63bb2548fb27e32576329159543

形式:

https://gist.github.com/frague59/aa5236eb11982bd810f81342da8bc05d

2 个答案:

答案 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

感谢您的帮助!