我有一个Django模型,它有一个外键owner
,指的是拥有这个对象的用户。
为了让其他用户编辑这些对象,我目前使用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__
之前完成的。
有人做过这样的事吗?
答案 0 :(得分: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)
答案 1 :(得分:0)
为什么不创建两个表单:
对于不拥有数据的用户(满口)排除所有者并在您的视图中执行简单if语句的人:
if request.user == Model.owner:
form = OwnerForm
else:
form = OthersForm
保持尽可能简单有巨大的胜利。