1

如何在传单弹出窗口中创建 csrf 令牌,以便用户可以通过与表单交互将一些文本发布到数据库?我已经将{% csrf_token %}标签添加到一个简单的 html 表单中,它工作正常,但是当我将它放在弹出窗口的内容部分时它不起作用,尽管其他 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);

});

基本上,当我将令牌留在其中时,Leaflet 地图不会完全加载,但如果我将其排除在外,我会收到 CSRF 令牌丢失或不正确的错误。

我对这一切(javascript/leaflet/web dev/django)有点陌生,所以我不确定问题出在哪里或应该从哪里开始?我想我将不得不在leaflet.js 代码周围戳一下,但我不确定我是否能够理解它。任何明确的建议或我可以插入的一些代码,或者只是为什么(用外行的话)代码不能正常工作!

4

2 回答 2

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);

上面更正的代码将起作用。

于 2015-03-30T23:47:28.413 回答
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;
}  

好好享受

于 2014-01-20T12:19:44.763 回答