首页 > 解决方案 > 如何在 django 中通过 ajax 接收和保存数据?

问题描述

通过ajax我正确发送数据,因为我通过wireshak看到的数据是正确的。在django服务器上,他向我发送了正确的请求“POST / solit / HTTP / 1.1”200 52。但是发送的值没有收到,它没有到达Mysql数据库,我不明白为什么,如果流量发送以及数据。

在wireshak中,我看到了发布请求的数据,它们是正确的,但它们没有保存在数据库中,当我希望添加它们时,就好像我要更新这些数据库字段的记录一样,但它没有,我不明白为什么

这是我的意见.py

def solit(request):
if request.method == 'POST' and request.is_ajax():
    form = addiForm(request.POST)
    if form.is_valid():
        peticion = form.save(commit=False)
        peticion.usuario = request.user
        peticion.save()
        peticion.usuario.d_pendientes = form.cleaned_data.POST.get('d_pendientes')
        peticion.usuario.h_pendientes = form.cleaned_data.POST.get('h_pendientes')
        peticion.usuario.save()   
    return JsonResponse({'status': 'true', 'msg': 'Procesado Correctamente'})

form = addiForm()
return render(request, 'plantillas/adicionar.html', {'form':form})

这是我的models.py--------------

class Usuarios(AbstractUser):

    numero_empleado = models.IntegerField(null= True, blank= True)
    area = models.CharField(max_length = 200, null= True, blank= True)
    d_pendientes = models.IntegerField(null= True, blank= False)
    h_pendientes = models.IntegerField(null= True, blank= False)
    f_init = models.DateField(max_length = 200,null= True, blank= True)
    init_vac = models.DateField(max_length = 200, null= True, blank= True)
    fin_vac = models.DateField(max_length = 200, null= True, blank= True)
    ul_vac_tomadas = models.IntegerField(null= True, blank= True)


class Peticion(models.Model):
    solit_choices = (
    ('Adicionar','Adicionar'),
)
    solicitudes_id = models.AutoField(primary_key=True)
    usuario = models.ForeignKey(Usuarios, on_delete=models.CASCADE, null=True, blank=True)
    petit = models.CharField(max_length = 255, choices=solit_choices, null=True, blank=False)
    fec = models.DateTimeField(auto_now=True)
    razon = models.TextField(max_length=255, null=True, blank=True)
    periodo_init = models.DateField(max_length = 200, null=True, blank=True)
    periodo_fin = models.DateField(max_length = 200, null=True, blank=True)
    dias_adicion = models.IntegerField(null=True, blank=False)
    horas_adicion = models.FloatField(null=True, blank=False)

这是我的forms.py

class addiForm(forms.ModelForm):
class Meta:
    """Formulario de solicitud"""

    model = Peticion

    fields = [

        'solicitudes_id',
        'petit',
        'razon',
        'periodo_init',
        'periodo_fin',
        'dias_adicion',
        'horas_adicion',

    ]

    labels = {

        'solicitud_id':'Solicitud',
        'petit':'Tipo de Petición',
        'razon':'Razon',
        'periodo_init':'Rango de fecha inicial',
        'periodo_fin':'Fecha final',
        'dias_adicion':'Dias a adicionar, si es mas de 8 horas',
        'horas_adicion':'Horas a adiciona, si es menos de 1 dia',

.html 文件

{% extends "plantillas/base.html" %}
{% block content %}
{% load staticfiles %}
{% now "Y-m-d H:i:s" %} <br>
{{ user.Peti}}
{{ user.numero_empleado}}
<script src="{% static 'js/int.js'%}"></script>
<script
  src="https://code.jquery.com/jquery-3.4.1.js"
  integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>

<div><form method="POST" id="demo" class="form-data" action="{% url 'solit' %}">
   {% csrf_token %}
    <h6>Tipo de peticion:{{form.petit}}</h6>
    <h6>Razon:{{form.razon}}</h6>
    <h6>{{form.solicitudes_id}}</h6>
    <h6>Fecha inicio:{{form.periodo_init}}</h6>
    <h6>Fecha fin:{{form.periodo_fin}}</h6>
    <h6>Introduzca dias a tomar<input id="dias" type="number" name="dias_adicion"></h6>
    <h6>Introduzca horas a tomar<input id="horas" type="number" name="horas_adicion"></h6>
    <input type="hidden" id="const_dias" name="d_pendientes" value="{{ user.d_pendientes }}">
    <input type="hidden" id="const_horas" name="h_pendientes" value="{{ user.h_pendientes }}">

    <button type="submit" onclick="calculo()">Guardar</button>
</div></form></span>
<h6>Recuerde, que usted dispone de {{ user.d_pendientes }} dias y {{ user.h_pendientes }} horas</h6>

.js 文件---------------------

function calculo()

{

    var dias = parseInt(document.getElementById('dias').value);
    var horas = parseFloat(document.getElementById('horas').value);
    var dias_base  = parseInt(document.getElementById('const_dias').value);
    var horas_base  = parseFloat(document.getElementById('const_horas').value);

    dias_base -= dias;
    horas_base -= horas;

    document.getElementById('const_dias').value = dias_base;
    document.getElementById('const_horas').value = horas_base;



} console.log(calculo);

服务器 django 控制台 [24/Jul/2019 15:30:47] "POST /solit/ HTTP/1.1" 200 52 和 js 控制台消息:"Procesado Correctamente" 状态:"true"

ajax 脚本--------------------------------------------

$(document).ready(function(calculo){
var productForm = $("#demo")

productForm.submit(function(event){
  event.preventDefault();

  var thisForm = $(this)
  var actionEndpoint = thisForm.attr("action");
  var httpMethod = thisForm.attr("method");
  var formData = thisForm.serialize();

  $.ajax({
    url: actionEndpoint,
    method: httpMethod,
    data: formData,
    success: function(data){
      console.log("success")
      console.log(data)
    },
    error: function(erroData){
      console.log("error")
      console.log(erroData)
    }
  })

 })
})

标签: htmldjangodjango-forms

解决方案


您的 JavaScript 代码中没有任何内容可以发出 AJAX 请求——它只是一个普通的 POST 请求。这意味着request.is_ajax()将是错误的,并且不会执行表单保存代码。


推荐阅读