Javascript 属性错误:';unicode';对象没有属性';获取';-以Django形式

Javascript 属性错误:';unicode';对象没有属性';获取';-以Django形式,javascript,jquery,ajax,django,Javascript,Jquery,Ajax,Django,我正在尝试将Django表单用于Ajax调用 以前我只是使用了一个html表单,我可以通过request.POST['item']获取所有信息。但我一直在考虑验证器,如果我将普通html表单转换为Django表单,我会受益匪浅 在我的HTML代码中(用户单击的页面,AJAX使用javascript调用另一个视图): 使用的表单是changeChartNameForm: #Form for editing chart names class changeChartNameForm(forms.Fo

我正在尝试将Django表单用于Ajax调用

以前我只是使用了一个html表单,我可以通过request.POST['item']获取所有信息。但我一直在考虑验证器,如果我将普通html表单转换为Django表单,我会受益匪浅

在我的HTML代码中(用户单击的页面,AJAX使用javascript调用另一个视图):

使用的表单是changeChartNameForm:

#Form for editing chart names
class changeChartNameForm(forms.Form):
    #Only one variable which is called chartName, with label set to ""
    #Since I don't want any labels. I have my own in HTML.
    chartName = forms.CharField(max_length=100, label="")
    #form-control is an extra class that is required by bootstrap 3, and the html id
    #of the form is called chartName
    chartName.widget.attrs['class'] = 'form-control'
    chartName.widget.attrs['id'] = 'chartName'
HTML代码:

<div class="input-group">
    <span class="input-group-btn">
        <button class="btn btn-default" type="button" id="newChartName" >New Chart Name</button>
    </span>
    {{ chartNameForm }}
</div>
基本上,javascript代码将调用此视图,称为ajax\u postColumnAction:

#Get the name form, and get the newName
changeNameForm = changeChartNameForm(request.POST['changeNameForm'])
newName = ""
if(changeNameForm.is_valid()):
    newName = changeNameForm.cleaned_data['chartName']
回报总是:

“unicode”对象在以下行中没有属性“get”:if(changeNameForm.is\u valid())

我尝试了以下方法:

  • 使用data=request.POST
  • 使用data=request.POST['changeNameForm']
  • 完全回溯:

    Traceback (most recent call last): 
    File "C:\Users\Desktop\Dropbox (Personal)\Django\Dashboard_Web\WebApp\views.py", line 738, in ajax_postColumnAction if(changeNameForm.is_valid()): 
    File "C:\Python27\lib\site-packages\django\forms\forms.py", line 129, in is_valid return self.is_bound and not bool(self.errors) 
    File "C:\Python27\lib\site-packages\django\forms\forms.py", line 121, in errors self.full_clean() 
    File "C:\Python27\lib\site-packages\django\forms\forms.py", line 273, in full_clean self._clean_fields() 
    File "C:\Python27\lib\site-packages\django\forms\forms.py", line 282, in _clean_fields value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 
    File "C:\Python27\lib\site-packages\django\forms\widgets.py", line 207, in value_from_datadict return data.get(name, None) AttributeError: 'unicode' object has no attribute 'get'
    
    编辑:

    当我这样做时:

    print request.POST['changeNameForm']
    

    我得到chartName=“我在浏览器中键入的一些文本”

    这部分错误说明
    数据是unicode字符串:

    return data.get(name, None) AttributeError: 'unicode' object has no attribute 'get'
    
    数据
    必须是对象。相反,它是一个字符串,字符串没有
    get()
    方法,也没有
    name
    属性,正如错误跟踪所说

    尝试使用Django文档来正确调用AJAX:


    解决方法似乎是在视图中构造表单

    我查看了十分之一和数百个StackOverFlow帖子和谷歌网站,非谷歌网站似乎有我的问题

    方法是在获取POST数据时重新创建表单,因为表单使用字典作为构造函数

    changeNameForm = changeChartNameForm({request.POST['changeNameForm'].split("=")[0]}):request.POST['changeNameForm'].split("=")[1]})
    
    我知道这个请求。POST['changeNameForm']返回一个字符串“chartName=someName”。我用“=”拆分字符串,得到someName和chartName。因此,我会把某个名字放进字典,其中的键叫做chartName

    {'chartName':'someName'}
    

    因此,表单将使用post数据重新创建,并且最终通过是有效的。

    您好,感谢您的回复!我不明白的是,正常的帖子是通过request.POST返回的。在示例中:form=NameForm(request.POST),这非常有效。我的方式有何不同?根据另一个stackoverflow帖子:User:user931920,表明“django代码可以以处理其他表单提交的相同方式处理AJAX帖子”,加上我使用的是基于函数的视图,网页使用的是基于类的视图。
    changeNameForm = changeChartNameForm({request.POST['changeNameForm'].split("=")[0]}):request.POST['changeNameForm'].split("=")[1]})
    
    {'chartName':'someName'}