Django перенаправление обновления на детальное представление после ajax-обновления
Я хочу перенаправлять в детальное представление после обновления, которое использует ajax отправку формы.
Урлы
path('<uuid:pk>', concept_detail, name='concept_detail'),
path('<uuid:pk>/update/', update_concept, name='update-concept'),
Подробный просмотр
def concept_detail(request, pk):
context = {}
context['concept'] = Concept.objects.get(id=pk)
return render(request, 'concepts/concept_detail.html', context)
Обновить вид
@login_required
def update_concept(request, pk):
if request.method == 'POST':
try:
## I GET THE FORM DATA - I haven't included the querysets because I haven't figured it out yet, just want to get the redirect to work
print(request.POST)
## THIS DOESN'T WORK, BUT IT WORKS BELOW
concept = Concept.objects.filter(id=pk).first()
return redirect(concept)
except Exception as e:
print(e)
else:
## this populates the update form
context = {}
obj = get_object_or_404(Concept, pk=pk)
context['concept'] = obj
if (request.user == obj.user):
return render(request, 'concepts/concept_update.html', context)
else:
## If user didn't create the post but tried to go to update url, redirect to detail page - WORKS
concept = Concept.objects.filter(id=pk).first()
return redirect(concept)
Коды ответов Не знаю, почему я получаю 302 для представления обновления - я не получаю этого для представления создания, и формы и ajax в основном одинаковы.
"POST /concepts/1241955d-1392-4f85-b8ed-e3e0b89b4e50/update/ HTTP/1.1" 302 0
"GET /concepts/1241955d-1392-4f85-b8ed-e3e0b89b4e50 HTTP/1.1" 200 7577
AJAX FORM SUBMIT Форма намного более динамична, чем эта, поэтому я использую Ajax. Данные отправляются на сервер, но страница обновления остается на экране и не переходит на страницу детализации.
conceptForm.addEventListener('submit', function(e){
e.preventDefault();
var formdata = new FormData();
formdata.append('concept', conceptInput.value)
formdata.append('definition', definitionInput.value)
$.ajax({
url: "",
method: "POST",
data: formdata,
enctype: 'multipart/form-data',
processData: false,
contentType: false,
success: function(json){
console.log('SUCCESS')
conceptInput.value = ''
definitionInput.value = ''
},
error: function(xhr, errmsg, err){
console.log('ERROR')
console.log(xhr.status + ": " + xhr.responseText);
}
})
})
Я использую этот код из блога Real Python для обработки создания токена csrf.
Вы не можете перенаправить пользователя после ajax-запроса с помощью вашего бэкенда. Перенаправление должно быть обработано в вашем ajax вызове.
В представлении обновления проверьте, является ли это ajax-запросом. Например, используя is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
.
Если это ajax запрос, не возвращайте редирект, а возвращайте JsonResponse, например return JsonResponse({'concept':concept})
.
В вашем варианте успеха ajax, вы можете затем обработать перенаправление.
success: function(data){
console.log('SUCCESS');
conceptInput.value = '';
definitionInput.value = '';
concept = data['concept'];
redirect_url = #define your redirect url
window.location.replace(redirect_url);
},
Вместо того, чтобы возвращать значение концепции, вы также можете построить url в представлении обновления и вернуть его в ajax вызов.