Как передать переменную из HTML в другую функцию представления django

Intro: Я искал все вопросы на stackoverflow, но, к сожалению, после нескольких часов исследований я не могу найти решение, которое подходит для моих нужд. У меня есть переменная, генерируемая после того, как пользователь отправляет форму. Я получаю эту переменную с помощью Ajax вызова и затем передаю ее в представление django.


file.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){
        }
        })  
    })

Проблема: Я могу "принять" эту переменную в функцию представления django, но я не могу передать ajax_date переменную в другую функцию представления внутри того же файла views.py


views.py

1-я функция, в которой я получаю переменную ajax, приходящую из 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 

2-ая функция, где мне нужно использовать 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')

Фактическая ситуация: Какой объект return следует использовать в функции get_dato()?

Если я выведу ajax_date из второй функции, то получу:

None
<class 'NoneType'>

тем временем внутри первой функции все работает:

ajax_response_dict это:

{'date_id': 0}
<class 'dict'>

ajax_date это:

0
<class 'int'>

Как я могу решить эту проблему?

Одним из решений является разделение методов, которые отображают шаблон, и тех, которые выполняют какую-то логику бэкенда, например:

views.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)

index.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
      ...

    }

  });
});

Благодаря @Daniel я нашел основную ошибку в вызове Ajax. Проблема заключалась в строке var id_data = {date_id: 0};. Переменная js была пуста в начальной точке.

НО была еще одна ошибка, которую я допустил, потому что я пытался print(dato) после строки if form.is_valid(): поэтому я не могу получить значение внутри существующего представления, и я пытался заставить его работать, используя другое представление, которое действительно бесполезно для моей цели

Вернуться на верх