Как заставить перенаправление Django работать правильно при обновлении базы данных?

Я не могу заставить мой редирект работать правильно после обновления велосипеда в моем приложении Django.

lines of code: highlighted code line 12 is bikes/int:bike_id/ and the error message below says bikes/int:bike_id/ didn't match any of the potential urls.

Когда я использую представление update_bike и обновляю профиль велосипеда, если я перенаправляю просто на '/bikes', я попадаю обратно в коллекцию велосипедов/собственные велосипеды без проблем. Но когда я пытаюсь вернуться к профилю велосипеда, который я только что отредактировал, я получаю ошибку, что мой путь возврата не соответствует ни одному из шаблонов url. Хотя это тот же путь, который изначально привел меня на страницу профиля велосипеда (не на ту же страницу, где я редактирую велосипед, это другая страница).

Я вставил код функции сюда:

def bikes_update(request, bike_id):
    if request.method != 'POST' or 'user_id' not in request.session:
        return redirect("/") 
    this_bike = Bike.objects.filter(id=bike_id).update(
        name = request.POST['bike_name'],
        model = request.POST['model_id'],
    )
    return redirect('/bikes')
    return redirect('/bikes/<int:bike_id>')
    return redirect('/bikes/<int:bike_id>/')

Очевидно, что я использую только одно перенаправление, а не все три в последнем блоке. Но я не могу понять, почему по крайней мере один из двух последних не работает. Когда я закомментировал два нижних редиректа, return redirect('/bikes') работает нормально, но он переводит меня на страницу со списком всех моих велосипедов. Я хочу вернуться к профилю велосипеда, который я только что отредактировал, чтобы не переходить к нему из коллекции велосипедов. Переход к /bikes/int:bike_id/ работает нормально, когда я перехожу к профилю изначально, но после завершения редактирования я сталкиваюсь с проблемой, даже если это одна и та же строка. Как только я нажимаю кнопку отправки и пытаюсь перенаправить обратно на /bikes/int:bike_id/, я получаю ошибку.

Я могу правильно обновить профиль велосипеда, так что это как-то связано с этим редиректом, но я не понимаю.

Я не понимаю, как строка 12 в моем фрагменте экрана и текущий путь (оба выделены на изображении) не совпадают/не соответствуют.

Если вы хотите перенаправить на /bikes/<int:bike_id>/, то вы можете использовать строку формата, подобную этой...

def bikes_update(request, bike_id):
  if request.method != 'POST' or 'user_id' not in request.session:
      return redirect("/")
  this_bike = Bike.objects.filter(id=bike_id).update(
      name = request.POST['bike_name'],
      model = request.POST['model_id'],
  )
  return redirect(f'/bikes/{bike_id}/')

Вы должны добавить id здесь, а не здесь "int:bike_id". поместите вашу переменную id здесь, как это redirect(f'/bikes/{Id}').

redirect может принимать модель в качестве аргумента, поэтому вы можете сделать что-то вроде:

this_bike = get_object_or_404(Bike, pk=bike_id)    
return redirect(this_bike)

Однако вам понадобится метод get_absolute_url в вашем models.py. Например:

def get_absolute_url(self):
    return reverse("bikes", kwargs={"pk": self.pk})

Это можно использовать и для других вещей в Django (включая использование в шаблонах).

Дополнительная информация здесь: Django Docs

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