无法将文本字段值拉入后端。 Django的

时间:2017-07-22 08:48:14

标签: jquery python ajax django forms

我正在使用一个简单的HTML表单将数据传递到我的Django应用程序的后端。

我没有使用Django表单,因为我不需要更新数据库。

但是,我无法从表单中提取数据。

HTML code:

<form onsubmit="return false;">
    {% csrf_token %}
    <div class="col-md-6">
        <div class="input-group input-group-lg wow fadeInUp" data-wow-delay='0.8s'>
            <input type="text" id="fullname" required>
        </div>      
        <button onclick="SendMessage()">Send Your Message</button>
    </div>
    <div id="output"></div>
</form>

JQuery代码:

<script type="text/javascript">
    function SendMessage() {
        // $('.ajaxProgress').show();
        $.ajax({
            type: 'POST',
            url: ' {% url "payligent:send_message" %} ',
            dataType: 'json',
            async: true,
            data: {
                csrfmiddlewaretoken: '{{csrf_token}}',
                fullname: $('#fullname').val()
            },
            success: function (json) {
                $('output').html(json.message);
                $('ajaxProgress').hide();
            }
        });
    }
</script>

视图:

def send_message(request):
    test = request.POST.get('fullname')
    response_data = {}
    try:
        response_data['message'] = test
    except:
        response_data['message'] = 'Oh Snap! message was not sent correctly'
    return HttpResponse(json.dumps(response_data), content_type='text/html')

当我浏览:http://127.0.0.1:8000/sendmessage/时,我得到null而不是我在表单中填写的名称:

{"message": null}

我正在关注this教程。

3 个答案:

答案 0 :(得分:1)

您可能需要更改视图,稍微改变一下,

test = request.POST['fullname']
如果dict.get()不包含指定的密钥,则

''方法返回默认值dict。因此,try-except无法捕获异常。 但是,通过访问这样的键值,如果不存在,则引发KeyError异常。

尝试你的观点可能是这样的,

def send_message(request):
response_data = {}
try:
    response_data['message'] = request.POST['fullname']
except:
    response_data['message'] = 'Oh Snap! message was not sent correctly'
return HttpResponse(json.dumps(response_data), content_type='text/html')

答案 1 :(得分:1)

request.POST仅在请求发布时才有效,但如果您浏览http://127.0.0.1:8000/sendmessage/,当然您会因为request.GET而不是request.POST而感到空。

再一次,你错过了name="fullname"

希望这对你有用;

<form id="form-message" method="post">
  {% csrf_token %}
  <div class="col-md-6">
    <div class="input-group input-group-lg wow fadeInUp" data-wow-delay='0.8s'>
      <input type="text" id="fullname" name="fullname" required>
    </div>

    <button type="submit">Send Your Message</button>
  </div>
  <div id="output"></div>
</form>

<script type="text/javascript">
  var form = $('#form-message');
  var output = $('#output');

  form.submit(function () {
      $.ajax({
          type: "POST",
          url: "{% url 'payligent:send_message' %}",
          data: form.serialize(),
          success: function(message) {
            output.html(message);
          },
          error: function(message) {
            output.html(message);
          }
      });
      return false;
  });
</script>

views.py

def send_message(request):
    response_data = {}
    if request.method == 'POST':
        fullname = request.POST.get('fullname', None)
        if fullname is not None:
            response_data['message'] = fullname
        else:
            response_data['message'] = 'Oh Snap! message was not sent correctly'
    else:
        response_data['message'] = 'Request POST only!'
    return return HttpResponse(json.dumps(response_data))

答案 2 :(得分:0)

似乎我只是忘了添加&#34;#&#34;签到输出div。所以它应该是:

$('#output').html(json.message);

而不是:

$('output').html(json.message);