Introducción: He estado buscando todas las preguntas de stackoverflow pero, lamentablemente, después de horas de investigación, no puedo encontrar una solución que se adapte a mis necesidades. Tengo una variable generada después de que el usuario envía un formulario. Obtengo esta variable usando una llamada Ajax y luego la paso a una vista Django.
archivo.html
// if user clicked submit button, call ajax to pass variable to django view $('#submit').click(function() { var dato = 0; $.ajax({ url: '{% url 'todo:get_dato' %}', dataType: 'text', method: "POST", data: { csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(), data: JSON.stringify(dato), }, success: function(data, status, xhr) {}, error: function(xhr, status, error){} }) }); Problema: puedo "recibir" esta variable en una función de vista de django pero no puedo pasar la variable ajax_date a otra función de vista dentro del mismo archivo views.py
vistas.py
Primera función donde obtengo la variable ajax proveniente de HTML
@login_required @user_passes_test(staff_check) def get_dato(request): if request.method == 'POST' and 'data' in request.POST: ajax_response_dict = json.loads(request.POST['data']) ajax_date = ajax_response_dict.get('date_id') request.session['ajax_date'] = ajax_date 2da función donde necesito usar la variable ajax_date
@login_required @user_passes_test(staff_check) def calendario(request): form = EventForm(request.POST) if form.is_valid(): form.save() #HERE I NEED TO USE VARIABLE ajax_date = request.session.get('ajax_date') Situación real: ¿Qué tipo de objeto de return debo usar en la función get_dato()?
Si ajax_date desde la segunda función, obtuve:
None <class 'NoneType'>mientras que dentro de la primera función todo funciona:
ajax_response_dict es:
{'date_id': 0} <class 'dict'> ajax_date es:
0 <class 'int'>¿Cómo puedo solucionar este problema?
Una solución es separar los métodos que generan una plantilla de aquellos que realizan algún tipo de lógica de back-end, por ejemplo:
vistas.py
def render_index(request): ''' this method serves the index.html page only ''' return render(request, 'index.html') def submit_form(request): ''' this method unpacks a post request and does something with it ''' # unpack request: date = request.POST.get('date') # do something with date ... # create the response: response = {'message':'OK'} return JsonResponse(response)índice.html
<button id='btn'>Click Me!</button> <script src="{% static 'scripts.js' %}"></script>scripts.js
$('#btn').click(function() { /* this method sends a post request to the backend */ $.ajax({ url : 'submit_form', type : 'POST', data : { date : new Date(), ... }, success : function(response) { /* this method executes on a successful response from the backend */ var message = response.message // do something with the message, route user to new page, close form ... } }); });Gracias a @Daniel encontré el error principal en la llamada Ajax. El problema era la línea var id_data = {date_id: 0}; La variable js estaba vacía en el punto de partida.
PERO cometí otro error, porque estaba tratando de print(dato) después de la línea if form.is_valid(): es por eso que no puedo obtener el valor dentro de la vista existente y traté de hacerlo funcionar usando otra vista que es realmente inútil para mi objetivo