2015-10-15 75 views
-1

有在我的知識很大的差距,所以我可能會試圖解決這種錯誤的方式。目標是使用此Google Maps JavaScript API來自動完成和解析地址輸入,並將結果保存在模型中。Django的 - 谷歌地圖API - 通過JS變量通過形式view.py

我找不到一個方法來將變量從JS直接傳遞到view.py,所以現在計劃是讓JS填充一個隱藏字段as suggested by a previous unsolved question

可以由ModelForm產生的場被用於此?如果不是,應該如何創建表單以便JS填寫字段,這些字段是隱藏的,並且不會被用戶更改,並且它使用csrf_token

這是我迄今爲止所有的。有一堆由JS自動填充的input字段。通過ModelForm產生的form|crispy沒有得到填補,即使id是相同的(在models.py字段名稱是相同的谷歌的命名方案)。我不明白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

如果你想通過從JS變量Django的,那麼你可以看看張貼一個Ajax請求您的視圖,並提供您在data屬性想要的任何數據。

例如,我在做的正是這種利用基因敲除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') 
    } 
}); 

你可以得到你想要的字段值,變量或任何其他人,並通過他們在$.ajaxdata屬性。

或者,您可以在您的ModelForm中使用HiddenInput()小部件設置字段,以便您的JavaScript可以填充它們,而無需用戶擔心它們。然後,如果他們填寫正確,你可以發佈表格&你的數據將被髮送到視圖。

要閱讀Ajax,這看起來像是一篇很棒的文章; https://realpython.com/blog/python/django-and-ajax-form-submissions/

本質上url屬性也只是某個地方,你有你的視圖設置像/myapp/myview/,然後在你看來這是非常相似,你會如何處理任何正常的POST請求。例如,我現在正在用上面的Javascript來做這件事,當它碰到我的視圖時;

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 

更新

那麼首先,當你確定你的網址,請確保您包括尾隨斜線或當它擊中Django的,它會被重定向。所以你需要url: '/place/new/'

另外,如果是在收到一個AJAX請求從服務器響應你應該返回JSON。所以你可能會這樣做;

def placenew(request): 
    if request.method == 'POST': 
     test = request.POST.get('address') 
     response_data = {} 

     if request.is_ajax(): 
      return HttpResponse(
       json.dumps(response_data), 
       content_type="application/json" 
      ) 
     return render(
      request, 'app/placenew.html', {'key':key} 
     ) 
    else: 
     print ("not POST") 
     return render(request, 'app/placenew.html', {'key':key}) 

另外,我假設你已經按照該教程,並在您的表單提交,你莫名其妙地觸發函數中定義你的Ajax調用?

+0

我對Ajax沒有經驗,我把代碼放在哪裏,有什麼要安裝的?至於替代方法,我現在正在嘗試,'id'似乎與示例中的匹配,但它不填充。編輯:nevermind,顯然Django將id_'放在id前,這就是可能是它不起作用的原因。 – dtgq

+0

是的,這是django渲染表單的標準。我更新了一些更詳細的信息和django&ajax文章的鏈接。 –

+0

我將它更改爲'url:'/ place/new /'',但沒有解決它。我儘可能地按照教程進行了操作,並且我知道它被調用,因爲'console.log('error')'起作用,並且它還在'place'中記錄了正確的信息。我不太明白'如果request.is_ajax():'裏面發生了什麼,但是我複製它並仍然打印'not POST'。 – dtgq