Я не могу заставить свою переадресацию работать правильно после обновления велосипеда в моем приложении Django.
Когда я использую свой метод bikes_update() и обновляю профиль велосипеда, если мое перенаправление просто на «/ bikes», я без проблем возвращаюсь к коллекции велосипедов/велосипедам. Но когда я пытаюсь перенаправить обратно к профилю велосипеда, который я только что отредактировал, я получаю сообщение об ошибке, что мой обратный путь не соответствует ни одному из шаблонов URL. Несмотря на то, что это тот же путь, который изначально приводит меня к просмотру профиля велосипеда (не тот же путь, где я редактирую велосипед, это другой вид).
Я вставил сюда метод bikes_update():
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}/')
Если нет решения, отдохните, отдых даст решение 😊 наслаждайтесь python
Вы должны добавить сюда идентификатор, а не этот "int:bike_id". поместите сюда свою переменную id, как это перенаправление (f'/bikes/{Id}').
Спасибо! Раньше у меня был идентификатор, но я не думал о строке f, не знаю почему.
redirect
может принимать модель в качестве аргумента, поэтому вы можете сделать что-то вроде:
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'],
)
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
Конечно, поскольку вы сейчас получаете объект для этой цели, вы можете рассмотреть возможность рефакторинга (не используя обновление набора запросов и, возможно, вместо этого изменяя атрибуты this_bike
), как вы обновляете его в первую очередь, поскольку вы имеете дело только с с одним объектом здесь.
Спасибо! Не могу поверить, что я не подумал о строке f прошлой ночью перед публикацией. Это пришло мне в голову после того, как я отключился на ночь, и это было первое, что я попробовал сегодня утром, прежде чем попасть сюда. Я ценю это!