Django - 模型表单继承

2 投票
1 回答
3119 浏览
提问于 2025-04-16 10:33

在Django的网站上,有这样一段示例代码:

>>> class RestrictedArticleForm(EnhancedArticleForm):
...     class Meta(ArticleForm.Meta):
...         exclude = ('body',)

我理解的是,这里有一个叫做EnhancedArticleForm(或者ArticleForm和EnhancedArticleForm)的模型表单,应该在渲染时把正文字段排除在外。我的代码看起来是这样的:

class EditUserForm(UserForm):
    class Meta(UserForm.Meta):
        exclude = ('username',)

我显然不想让用户能够更改他们的用户名。但是用这段代码后,所有做的只是把用户名字段放到了最后一个显示的位置。它并没有真正把这个字段排除掉。我是不是漏掉了什么明显的东西?

编辑:

显然这是因为Django中的一个bug。我试着像这样重写init,但是表单没有显示出来。我觉得可能是我这样做错了:

class EditUserForm(UserForm):
    def __init__(self,instance):
        UserForm.__init__(self,instance)
        del self.fields['username']

1 个回答

1

这其实是Django中的一个错误:

http://code.djangoproject.com/ticket/8620 (在这个链接的评论中可以找到适合你情况的内容)

不幸的是,看起来这个问题已经超过一年没有人处理了。

解决这个问题的一种方法是重写表单的 __init__ 方法,然后简单地把那个字段从 self.fields 中移除。

撰写回答