Javascript 属性错误:';unicode';对象没有属性';获取';-以Django形式
我正在尝试将Django表单用于Ajax调用 以前我只是使用了一个html表单,我可以通过request.POST['item']获取所有信息。但我一直在考虑验证器,如果我将普通html表单转换为Django表单,我会受益匪浅 在我的HTML代码中(用户单击的页面,AJAX使用javascript调用另一个视图): 使用的表单是changeChartNameForm: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
#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())
我尝试了以下方法:
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'}