Django forms.py构造函数行为

时间:2014-06-30 19:00:48

标签: python django django-models django-forms

我在Django 1.6.5中面临一个非常奇怪的问题。

在某些时候我需要将用户对象传递给我的forms.py,所以我定义了UploadFileForm,如下所示:

# forms.py

class UploadFileForm(forms.Form):

    def __init__(self, myuser):
        print myuser

在我的观看中,我像这样实例化UploadFileForm

# views.py

form = UploadFileForm(myuser=request.user)

一切都按预期工作正常。现在,如果我将forms.py更改为:

# forms.py

class UploadFileForm(forms.Form):

    def __init__(self, myuser=None):
        print myuser

每次我请求特定页面时,Django都会打印myuser 4次!用户名第一次正常打印但另外3个用户名只打印None

任何线索为什么会发生这种情况?

提前致谢。

P.S。 我知道正确的做法是先在父母身上调用super(),但事实证明行为保持不变,因此我为了简洁而保持这种方式

更新

这是完整的views.py代码:

@login_required
def uploadTool(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            # do various irrelevant stuff
            return HttpResponseRedirect('/OKPage/')
    else:
        form = UploadFileForm(myuser=request.user)

    return render(request, 'uploadForm.html', {'form': UploadFileForm})

更新2

我觉得它有点令人毛骨悚然。我又将forms.py更改为:

class UploadFileForm(forms.Form):

    def __init__(self, *args, **kwargs):
        for i, j in kwargs.iteritems():
            print i, j
        self.myuser = kwargs.pop('myuser')
        print self.myuser

# console output
myuser jsmith
jsmith

然而,Django不会渲染模板,而是会抱怨它无法找到myuser

最后,如果我将self.myuser = kwargs.pop('myuser')更改为self.myuser = kwargs.pop('myuser', None),Django现在将打印:

# console output
myuser jsmith
jsmith
None
None
None

并且将再次无法呈现模板。

1 个答案:

答案 0 :(得分:0)

即使Jamie Cockburn没有直截了当地回答,他发现了我的一个代码错误,结果发现它对所有这些奇怪的行为都是负责任的。

在我的views.py我有这个:

return render(request, 'uploadForm.html', {'form': UploadFileForm})

应该是什么时候:

return render(request, 'uploadForm.html', {'form': form})

在我做了这个修正后,一切都恢复了正常。