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 вызов.

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