I want to redirect to detail view after an update that uses ajax form submission.
Urls
path('<uuid:pk>', concept_detail, name='concept_detail'),
path('<uuid:pk>/update/', update_concept, name='update-concept'),
Detail View
def concept_detail(request, pk):
context = {}
context['concept'] = Concept.objects.get(id=pk)
return render(request, 'concepts/concept_detail.html', context)
Update View
@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)
Response Codes Don't know why I'm getting 302 for update view -- don't get that for my create view, and the forms and ajax are basically the same.
"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 The form is a lot more dynamic than this which is why I'm using Ajax. The data gets sent to server, but the update page stays on the screen and doesn't go to the detail page.
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);
}
})
})
I use this code from the Real Python blog to handle the csrf token creation.
WORKING NOW
def update_concept(request, pk):
is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
if request.method == 'POST' and is_ajax:
redirect_url = 'http://127.0.0.1:8000/concepts/'+str(pk)
return JsonResponse({'redirect_url':redirect_url})
## IN Javascript
$.ajax({
success: function(json){
window.location.replace(json['redirect_url'])
}
})