Cambiar un valor string a un entero – python django ajax

Pregunta:


Con el siguiente código quiero hacer una validación donde valide si un dato que voy a ingresar es mayor a otro que ya tengo, si es así, debe salir un mensaje de error.

Esto es lo que me aparece como ven el valor celda lo toma como un string, entonces necesito convertirlo a entero para poder hacer la comparación.

Object
TTC
:
-25
celda // <--
:
"1"
valido
:
true

Esta es mi vista:

  celda = request.POST.get('bonches', None)
        TC = Clasificacion.objects.filter(fecha=date.today()).aggregate(total=Sum('tabacos'))['total']
        TB = Boncheo.objects.filter(fecha=date.today()).aggregate(total=Sum('bonches'))['total']
        TN = Nacional.objects.filter(fecha=date.today()).aggregate(total=Sum('bonches'))['total']

        if TC == None:
            TTC = 0
        elif TB == None and TN == None:
            TTC = TC
        elif TB == None and TN != None:
            TTC = TC - TN
        elif TB != None and TN == None:
            TTC = TC - TB
        else:
            TTC = TC - TB - TN

        if celda < TTC:
            valido = False
        else: 
            valido = True
        return HttpResponse(json.dumps({'valido': valido , 'celda' : celda , 'TTC' : TTC}), content_type='application/json')

Esta es mi plantilla:

<div class="modal-header">
    <button type="button" class="cerrarmodal" data-dismiss="modal"><i class="fa fa-close"></i></button>
    <h4> <span><i class="fa fa-plus"></i></span>Nuevo Boncheo</h4>
</div>
<div class="modal-body">
    <div class="container-fluid">
        <form class="formatolinea" method="post" name="nboncheo" id="nboncheo" action='{% url "nuevobonche" %}'
        onsubmit="return boncheo();">
            {% csrf_token %}
            <label>Bonchador</label>
            <select required="" name="boncheador" required="">
                <option>Nombre del bonchador</option>
                {% for obj in bonchador %}
                <option>{{obj.nombre}} {{obj.apellidos}}</option>
                {% endfor %}
            </select>
            <div class="mensaje" id="mensajebr" style='display: none;'>Seleccione el nombre del bonchador</div>
            <label>Variedad</label>
            <select name="variedad">
                <option>Seleccione la variedad</option>
                <option>freedom</option>
                <option>vendela</option>
            </select>
            <div class="mensaje" id="mensajev" style='display: none;'>Seleccione la variedad</div>
            <label>Bonches</label>
            <input type="number" name="bonches" id="bonches" placeholder="Cantidad de bonches">
            <div class="mensaje" id="mensajeb" style='display: none;'>Digite el numero de bonches</div>
            <label>Unidades</label>
            <select id="unidades" name="unidades" onChange="mostrarl(this.value);" required="">
                <option>Seleccione las unidades</option>
                <option value="12">12</option>
                <option value="20">20</option>
                <option value="25">25</option>
            </select>
            <div class="mensaje" id="mensajeu" style='display: none;'>Seleccione el numero de unidades por bonche</div>
            <label>Grado</label>
            <select required="" name="grado">
                <option>Seleccione el grado</option>
                <option>40</option>
                <option>50</option>
                <option>60</option>
                <option>70</option>
            </select>
            <div class="mensaje" id="mensajeg" style='display: none;'>Seleccione el grado</div>
            <label>Lámina</label>
            <select name="lamina">
                <option>Seleccione la lamina</option>
                <optgroup label="Lamina" id="lamina1" style='display: none;'>
                    <option>Benchmark</option>
                    <option>Golden</option>
                    <option>Microcorrugada</option>
                </optgroup>
                <optgroup label="Lamina" id="lamina2" style='display: none;'>
                    <option>Pet Transparante con papel</option>
                    <option>Transparante</option>
                </optgroup>
            </select>
            <div class="mensaje" id="mensajel" style='display: none;'>Seleccione la lamina</div>
            <button class="guardar" type="button" id="button-save"><i class="fa fa-save"></i> Guardar</button>
            <button class="cancelar" type="reset" data-dismiss="modal"> <i class="fa fa-close"></i> Cancelar</button>
        </form>
    </div>

Y esta es mi función ajax:

<script>
    $(document).ready(function() {
        $('#button-save').click(function(event) {
            $.ajax({
                type: "POST",
                url: "{% url 'validarbonche' %}",
                data: {
                    bonches: $('#bonches').val(),
                    csrfmiddlewaretoken: $('input[name="csrfmiddlewaretoken"]').val()
                },
                success:function(response) {
                    console.log(response);
                    if ('valido' in response) {
                        if (response['valido']) {
                            $('#nboncheo').submit();
                            return true;
                        }else {
                            swal("El numero de bonches es mayor a los que hay actualmente");
                            event.preventDefault();
                            event.stopPropagation();
                            return false;
                        }
                    } else {
                        console.log("no hay 'valido' en response");
                        event.preventDefault();
                        event.stopPropagation();
                        return false;
                    }
                }
            })
        })
    })
    </script>

Preguntado por: Angie Lizeth Santiago Piñeros

Si estas segura que tu variable de celda siempre tendra numeros en dentro del string y solo tendrá numeros, entonces lo facil es usar la funcion int()

celda_string = '123'
celda_numero = int(celda_string)
print(type(celda_numero))
>>> <class 'int'>
print(celda_numero)
>>> 123

Ahora, si no sabes que recibiras exactamente en el post, que lo veo muy posible por las pocas validaciones que tienes, lo mejor es usar expresiones regulares acompañados de la funcion int()

import re
regex = re.compile(r'd+')
celda_int = int(regex.findall('hola123')[0]) # puede tener letras, pero solo se tendran en cuenta los números
print(celda_int)
>>> 123
print(type(celda_int))
>>> <class 'int'>

Creo que bastaría con la función int().

si validas correctamente que es un entero en el urls.py por ejemplo:

url(r'^test/view/(?P<celda>d*)$', views.tuVista)

entonces vastaría con hacer

def tuVista(request, celda):
    celda = int(celda)

pero sin parámetros en la url (como lo tienes) sería algo como

def tuVista(request):
    celda = int(request.POST.get('bounches', 0))

no uses None pues en la función int te mostrará la excepción:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

Fuente

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *