2012-07-10 73 views
1

如何在小冊子彈出窗口中創建csrf標記,以便用戶可以通過與表單交互來將一些文本發佈到數據庫?我已將{% csrf_token %}標記添加到一個簡單的html表單,該表單工作正常,但當我將它放入彈出窗口的內容部分時,它不起作用,但其他html元素仍可正常工作。如何在小冊子彈出窗口中以html形式創建csrf標記?

map.on('click', function(e) { 
var popupContent = '<p>What would you like to post to this location? <form action="/post_temp/" method="post"> {% csrf_token %} <p> <input type="text" name="post"> </p> <input type="submit" value="Post"> </form>', 
popup = new L.Popup(); 
popup.setLatLng(e.latlng); 
popup.setContent(popupContent); 
map.openPopup(popup); 

});

基本上,當我離開令牌時,Leaflet映射不會完全加載,但是如果我將其忽略,則會收到CSRF令牌丟失或不正確的錯誤。

我對所有這些(javascript/leaflet/web dev/django)有點新,所以我不確定問題來自哪裏或者我應該從哪裏開始?我想我將不得不圍繞leaflet.js代碼進行探討,但我不確定我能夠理解它。任何建議,明確要去或一些代碼,我可以插入,或者只是爲什麼(在外行的條款)代碼是不是很讚賞!

+0

我很可能在這裏錯了,因爲在診斷問題上沒有足夠的空間,但我懷疑您的JavaScript文件實際上並不是由Django模板系統生成的,因此您放入的標籤不會做有用的事情。 – 2012-08-16 21:34:38

回答

0

可以都由你自己發送csrfmiddlewaretoken

$.post("/view_func/", 
     { 
     yourself_var:yourself_data, 
     csrfmiddlewaretoken:getCookie('csrftoken'),//or use $.cookie 
     }, 
     function(data) { 
     //handler result 
     } 
    ) 

function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie != '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) == (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      }  
     }  
    }  
    return cookieValue; 
} 

享受

0

對於任何人的將來參考,樓主的代碼失敗的原因是因爲在Django,

{% csrf_token %} 

呈現爲單引用html元素。由於Django的模板語言在任何JavaScript或html元素之前呈現,所以引號會混亂。如果原作者將所有單引號轉換爲雙引號,並將雙引號轉換爲單引號,則代碼將起作用。

map.on('click', function(e) { 
var popupContent = "<p>What would you like to post to this location? <form action='/post_temp/' method='post'> {% csrf_token %} <p> <input type='text' name='post'> </p> <input type='submit' value='Post'> </form>", 
popup = new L.Popup(); 
popup.setLatLng(e.latlng); 
popup.setContent(popupContent); 
map.openPopup(popup); 

上述更正的代碼將工作。