Как передать переменную из 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(): поэтому я не могу получить значение внутри существующего представления, и я пытался заставить его работать, используя другое представление, которое действительно бесполезно для моей цели