0

我有一个 Django 模型,它有一个外键owner,指的是拥有这个对象的用户。为了让其他用户编辑这些对象,我目前使用 a forms.ModelForm,到目前为止效果很好。

但是我知道要让所有者并且只有所有者更改他拥有的对象的所有者(多么具有所有权!:)。因此我尝试了以下方法:

class FolderForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        if kwargs.get("instance", False):
            if user == kwargs["instance"].owner:
                self._meta.fields += ("owner",)

        super(FolderForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Folder
        fields = (
            "name",
            "description",
        )

但这不起作用,因为 Django 使用一些元类魔法来设置模型上的字段,这似乎是在__init__调用我的子类之前完成的。

有人做过这样的事情吗?

4

2 回答 2

1

我喜欢正常使用闭包

def make_form(exclude_user=True):
    class Form(forms.ModelForm):
        class Meta:
            model = Folder         
            exclude = ['user'] if exclude_user else None
    return Form

form_cls = make_form(request.user != folder.owner)
于 2012-04-20T14:38:26.530 回答
0

为什么不创建两个表单:

一个排除不拥有数据的用户的所有者(满口)并在您的视图中执行一个简单的 if 语句:

if request.user == Model.owner:
    form = OwnerForm
else:
    form = OthersForm

保持尽可能简单,这样才能赢得巨大的胜利。

于 2012-04-20T14:27:44.477 回答