我的知识存在很多差距,所以我可能试图以错误的方式解决这个问题。目标是使用此Google Maps JavaScript API自动完成并解析地址输入,并将结果保存在模型中。
我无法找到将变量从JS直接传递给view.py
的方法,所以现在的计划是让JS填充隐藏字段as suggested by a previous unsolved question。
ModelForm
生成的字段可以用于此吗?如果没有,应该如何创建表单以便JS填写字段,用户隐藏和不可更改字段,并且它使用csrf_token
?
到目前为止,这就是我所拥有的一切。有一堆input
字段由JS自动填充。即使form|crispy
相同,ModelForm
生成的id
也不会被填充(models.py
中的字段名称与Google相同)命名方案)。我不明白JS的最后一段是如何运作的,这可能是我被困的地方。
更新 以下代码没有发布POST,为什么?
<!-- language: lang-js -->
$.ajax({
type: 'POST',
url: 'http://localhost:8000/place/new',
dataType: 'json',
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
address: 'test'
},
success: function (response, textStatus, error) {
console.log('SUCCESS')
},
error: function (request, textStatus, error) {
console.log('error')
console.log(place)
}
});
<!-- end snippet -->
<!-- language: lang-python -->
def placenew(request):
if request.method == 'POST':
test = request.POST.get('address')
response_data = {}
print (test)
print ("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
return render(request, 'app/placenew.html', {'key':key})
else:
print ("not POST")
return render(request, 'app/placenew.html', {'key':key})
<!-- end snippet -->
答案 0 :(得分:0)
如果您想将变量从JS传递到django,那么您可以查看向您的视图发布ajax请求并在data
属性中提供您想要的任何数据。
例如,我正在使用Knockout JS完成此操作,所以我有这个ajax请求;
$.ajax({
url: URLS.design,
method: 'POST',
data: {
data: ko.mapping.toJSON(structure_data)
},
success: function (response, textStatus, error) {
console.log('SUCCESS')
},
error: function (request, textStatus, error) {
console.log('error')
}
});
您可以获取字段值,变量或您想要的任何其他内容,并将其传递到data
的{{1}}属性中。
或者,您可以使用$.ajax
小部件在ModelForm中设置字段,以便您的javascript可以填充它们,而无需用户担心它们。然后,如果他们填充正确,你可以发布表格&amp;您的数据将被发送到视图。
要阅读Ajax,这看起来很棒; https://realpython.com/blog/python/django-and-ajax-form-submissions/
基本上,HiddenInput()
属性只是在某个地方,您可以将视图设置为url
,然后在您的视图中,它与您处理的方式非常相似任何正常的POST请求。例如,我正在使用上面的Javascript来点击我的观点时这样做;
/myapp/myview/
<强>更新强>
首先,当您定义URL时,请确保包含一个尾部斜杠,或者当它击中Django时,它会被重定向。所以你想要def get_forms(self, forms):
data = None
if self.request.method in ('POST', 'PUT'):
if self.request.is_ajax():
_json = self.request.POST.get('data')
data = json.loads(_json)
else:
data = self.request.POST
。
此外,如果服务器的响应收到了AJAX请求,则应返回JSON。所以你可能会做类似的事情;
url: '/place/new/'
另外,我假设您已经按照该教程进行了调整,并且在您提交表单时以某种方式触发的函数中定义了ajax调用?