【问题标题】:django ajax request dont get datadjango ajax请求不获取数据
【发布时间】:2017-01-29 16:17:53
【问题描述】:
<form id="searchform">
    {% csrf_token %}
    <div class="col-md-8">
        <input  type="text" id="question" class="form-control" placeholder="question......"
         name="question">
    </div>
    <div class="col-md-2">
        <input class="btn btn-primary" type="submit"  value="ASK">
    </div>
<form>

我有这个模板和下面的 ajax 请求来查看数据

<script type="text/javascript">
$("document").ready(function(){
    $("#searchform").submit(function() {
        $.ajax({
            type: "POST",
            url : "results",
            data:{
                input:$("#question").val(),
                csrfmiddlewaretoken: '{{ csrf_token }}'
            },
            success : function(data){
                $('#answer').html(data);
            }
        },"json");
    });
});
</script>

下面是视图

def results(request):
    if request.method == "POST":
        resource = request.POST['input']
    return render(request, 'index.html',{"resource" : resource}) 

我在表单中提交的内容可以在 url 中看到。但不会在模板中打印结果。这段代码有什么问题?提前谢谢 :)

【问题讨论】:

    标签: jquery ajax django django-forms


    【解决方案1】:

    我看到您编写此代码的方式存在几个问题。 Ajaxifying 表单提交是微不足道的,可以非常优雅地完成。

    让我根据你分享的代码来解释一下。

    首先,您的表单没有操作和方法。即使浏览器不支持 javascript,正确定义的表单也应该可以工作。

    您的某个表单表单域没有名称参数。

    <form id="searchform" method="POST" action="{% url 'results' %}">
        {% csrf_token %}
        <div class="col-md-8">
            <input  type="text" id="question" name="input" class="form-control" placeholder="question......"
             name="question">
        </div>
        <div class="col-md-2">
            <input class="btn btn-primary" type="submit"  value="ASK">
        </div>
    <form>
    

    现在在您的 javascript 中,您只需添加一个覆盖并阻止默认行为。这就是您的页面仅更改 url 的原因。

    更通用的版本。看到您也不必形成数据有效负载和其他内容。

    $(document).on('submit', "#searchform", function (event) {
      event.preventDefault();
      var ele = $(this);
      $.ajax({
        type: ele.attr("method"),
        url: ele.attr("action"),
        data: ele.serialize(),
        success: function (data) {
           $('#answer').html(data);
        }
      });
    });
    

    我认为您的观点没有问题。

    【讨论】:

      【解决方案2】:

      在您的视图中返回一个JsonResponse 对象:

      from django.http import JsonResponse
      
      def results(request):
          if request.method == "POST":
              resource = request.POST['input']
          return JsonResponse({"resource" : resource})
      

      【讨论】:

      • 它不打印数据。但在 url 中显示输入的数据。我想在模板中打印数据
      • 在您的 javascript 中,在 success 函数中,添加以下内容:$('#answer').html(data.resource);
      【解决方案3】:

      您的表单通过 GET 方法和 GET 参数(表单的默认行为)提交。 要解决此问题并让您的代码正常工作 - 只需阻止该默认行为

      $("#searchform").submit(function(event) {
          event.preventdefault();
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        相关资源
        最近更新 更多