1

ユーザーがフォームを操作してテキストをデータベースに投稿できるように、リーフレット ポップアップで csrf トークンを作成するにはどうすればよいですか? タグを単純な html フォームに追加しましたが{% csrf_token %}、これは正常に機能しますが、ポップアップのコンテンツ セクションに配置すると機能しませんが、他の 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

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 に答える
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 に答える