Я попытался разбить эту проблему на простейший пример. Когда запрос является ajax, рендеринг страницы с обновленным контекстом не дает ожидаемого результата.
index.html:
<html>
<body>
{% if templateVariable %}
<h1>{{ templateVariable }}</h1>
{% endif %}
<button id="testBtn">TEST</button>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$(function() {
$('#testBtn').click(function(event) {
$.ajax({
type: "POST",
url: "./",
data: {
'x' : 'x',
'csrfmiddlewaretoken' : '{{ csrf_token }}'
}
});
});
});
});
</script>
</body>
</html>
просмотров.py
def index(request):
context = {}
if 'x' in request.POST:
context['templateVariable'] = 'I was updated via ajax'
print('ajax ran')
return render(request, 'index.html', context)
context['templateVariable'] = 'I was not updated via ajax'
print('ajax was not run')
return render(request, 'index.html', context)
Когда я впервые загружаю страницу, печатается «ajax не был запущен», templateVariable - «Я не обновлялся через ajax», и страницарендерится с этим в теге h1 как ожидалось.
Когда я нажимаю testBtn, я ожидаю, что запрос ajax вызовет оператор if, обновит контекст и отобразит страницу с 'Iбыл обновлен с помощью ajax 'в теге h1.
Вместо этого печатается «ajax ran», но templateVariable остается «Я не обновлялся с помощью ajax» при визуализации страницы. «ajax не был запущен» печатается только один раз при начальной загрузке страницы.
Почему бы мне не получить ожидаемый результат?
РЕДАКТИРОВАТЬ: Кажется, все согласны с тем, что вы не можете вернуть переменные рендеринга и контекста с помощью запроса ajax, но у меня все еще есть проблемы с этим, так как я считаю, что это возможно. Вот некоторый альтернативный код:
index2.html:
<html>
<body>
{% if templateVariable %}
<h1>{{ templateVariable }}</h1>
{% endif %}
<h1 id="placeHolder"></h1>
<button id="testBtn">TEST</button>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$(function() {
$('#testBtn').click(function(event) {
$.ajax({
type: "POST",
url: "./",
data: {
'x' : 'x',
'csrfmiddlewaretoken' : '{{ csrf_token }}'
},
success: function (data) {
$('#placeHolder').html(data);
},
dataType: 'html'
});
});
});
});
</script>
</body>
</html>
views2.py
def index2(request):
context = {}
if 'x' in request.POST:
context['templateVariable'] = 'I was updated via ajax'
print('ajax ran')
return render_to_response('notIndex.html', context)
context['templateVariable'] = 'I was not updated via ajax'
print('ajax was not run')
return render(request, 'index.html', context)
notIndex.html:
{% if templateVariable %}
{{ templateVariable }}
{% endif %}
- В этом примере страница изначально загружается с помощью templateVariable в контексте «Я не обновлялся с помощью ajax».
- При нажатии testBtn запрос ajax вызывает блок if в представлении. Это отображает notIndex.html с обновленным контекстом.
- Функция успеха вызова ajax устанавливает сгенерированный html из notIndex.html в тег h1.
Так почему это толькоМожно ли запустить рендеринг страницы с помощью ajax, если страница не та, с которой поступил вызов ajax?