Django - Google Maps API - 通过表单将JS变量传递给view.py.

时间:2015-10-15 07:43:21

标签: javascript django google-maps

我的知识存在很多差距,所以我可能试图以错误的方式解决这个问题。目标是使用此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 -->

1 个答案:

答案 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调用?