通过Ajax将数据从Django模板发送到views.py

时间:2020-06-22 22:34:53

标签: python django ajax

我正在通过ajax将一些数据从html模板发送到views.py。从发送到views.py的id中我正在创建sql记录。但是我想知道是否有任何方法可以将views.py中的数据发送到模板,以通知该数据已添加到sql。

代码-

$('#tn1').click(function(){
          var msg='';
          alert('inside alert');
          if ($('textarea#message') != "") {
            var message = $('#notesarea').val();
            alert(message);
            msg=message;
          }


          $.ajax({
        url: 'post_note',
        data: {
          'note': msg
        },

        success: function (data) {
          alert(data)
        }
      });

views.py

def post_note(request,id):
    post_id = request.GET['note']
    print(post_id)
    //sql insertion code,once its done i want to notify to the front end..print some alert message.
    return render(request, './profile.html')

3 个答案:

答案 0 :(得分:0)

您应该在视图中使用类似JSONResponse的内容,这样您的数据就会显示在成功函数中

 success: function (data) {alert(data)}

答案 1 :(得分:0)

您可以在模板中使用JQuery Ajax并通过在views.py中创建一个“ API视图”来执行此操作,该视图基本上是一个常规视图,在检查以确认请求为Ajax后返回一个JSONResponse。作为“ API”选项的示例,使用JQuery:

在views.py文件中(使用GET方法,仅在注释简短的情况下才应使用该方法,该方法将适合URL栏,并且如果您没有重大安全问题,否则请参阅底部的POST示例):

    from django.http import JsonResponse

    def post_note_api(request):
          data = {}
          if request.GET.get('post_note', None) is not None:
              post_note = request.GET.get('post_note')
              # save the note and indicate success
              data['result'] = True
              data['message'] = "Note posted successfully"
              ...
          if request.is_ajax():
             return JsonResponse(data)
          else:
             return HttpResponseBadRequest()
     

在您的urls.py中:

...
path('/api/post_note/', post_note_api, name="post_note_api"),
...

在模板中(如果您使用的是GET方法):

  <script type="text/javascript">
$("#tn1").click(function(){
    var message = $("#myTextArea").val();
    $.ajax({ url: '{% url 'post_note_api' %}?post_note=' + message,
                        type: "GET",
                        dataType: "json",
                        cache: false
               }).done(function(data) {
                    if (data.result === true){
                        alert(data.message);
                   }
               });
          });
       });
</script>

如果您使用的是POST方法而不是GET(这里可能是更好的选择):

<script type="text/javascript">
        $("#tn1").click(function(){
            var csrfToken = $( "input[name='csrfmiddlewaretoken']");
            var message = $("#myTextArea").val();
                $.ajax({ url: '{% url 'post_note_api' %}',
                                    type: "POST",
                                    dataType: "json",
                                    data: {'post_note':message, 'csrfmiddlewaretoken':csrfToken.val()},
                                    cache: false
                           }).done(function(data) {
                                if (data.result === true){
                                    alert(data.message);
                               }
                           });
                      });
                  });
            </script>

对于POST方法,您只需将request.GET.get('post_note') ...更改为request.POST.get('post_note') ...即可,

        from django.http import JsonResponse

        def post_note_api(request):
              data = {}
              if request.POST.get('post_note', None) is not None:
                  post_note = request.POST.get('post_note')
                  # save the note and indicate success
                  data['result'] = True
                  data['message'] = "Note saved successfully"
                  ...
              if request.is_ajax():
                 return JsonResponse(data)
              else:
                 return HttpResponseBadRequest()

通过POST发送数据时,请不要忘记像上面的示例一样传递CSRF令牌。假定您在页面上有一个表单可以从中获取,否则您可以使用类似的方法获取它:

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 = cookies[i].trim();
            // 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;
}
var csrftoken = getCookie('csrftoken');

如果您不想使用CSRF令牌,则可以使用@csrf_exempt装饰器标记视图,并从模板中的Ajax调用中删除“ csrfmiddlewaretoken”数据元素,但是它可能不是理想的,也不是最安全的。一个例子:

    from django.views.decorators.csrf import csrf_exempt
    from django.http import JsonResponse

    @csrf_exempt()
    def post_note_api(request):
           ...

现在,在不了解更多信息的情况下,这基本上只是伪代码(加上我只是在脑海中写下了这个代码,因此可能会有错误)。如果您发布更多详细信息,我可以更新我的答案,但是我认为这应该可以帮助您入门。

答案 2 :(得分:0)

我在下面使用过从HTML将数据发送到views.py,然后将成功响应返回给HTML。希望对您有所帮助:)

HTML代码:

<a href="{% url 'save' %}"><button class="button primary fit small" onclick="saveContent()">Save</button></a>

JavaScript代码:

<script>
function saveContent(){
var code =editor.getSession().getValue();
var URL = "{% url 'save' %}";
var data = {'code': code};
$.post(URL, data, function(response){ // This is the main function that will help you
    if(response === 'success'){ window.location.reload(); }
    else{ alert('Error! :('); }
});
}
</script>

View.py:

def save_content(request):
    if request.method == 'POST':
        if 'code' in request.POST:
            file_data = request.POST['code']

return HttpResponse('success')