Cambiar un valor string a un entero

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>
1
задан 19.10.2016, 01:07
3 ответа

Если ты уверена, что твоя переменная celda всегда у него будут числа во внутри string и только у него будут числа, тогда легкое состоит в том, чтобы использовать функцию int()

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

Сейчас, если ты не знаешь, что ты получишь точно в post, который мне это кажется очень возможным из-за небольшого количества утверждений, которые у тебя есть, лучшее состоит в том, чтобы использовать регулярные выражения сопровожденные функцией 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'>
2
ответ дан 24.11.2019, 13:03

Я верю в то, что bastarГ - в с нею funciГіn int().

1
ответ дан 24.11.2019, 13:03

если ты санкционируешь правильно, что является целым числом в urls.py например:

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

тогда vastaría несмотря на то, что делает

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

но без параметров в url (поскольку это у тебя есть) оно было бы чем-то как

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

не используй None, так как в функции int он покажет тебе исключение:

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'
0
ответ дан 24.11.2019, 13:03