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

Я не могу заставить свою переадресацию работать правильно после обновления велосипеда в моем приложении 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 в моем фрагменте экрана и текущий путь (оба выделены на изображении) не совпадают/не совпадают.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вы хотите перенаправить на /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}/')

Спасибо! Не могу поверить, что я не подумал о строке f прошлой ночью перед публикацией. Это пришло мне в голову после того, как я отключился на ночь, и это было первое, что я попробовал сегодня утром, прежде чем попасть сюда. Я ценю это!

Kyle Christian 24.01.2023 13:41

Если нет решения, отдохните, отдых даст решение 😊 наслаждайтесь python

Mahammadhusain kadiwala 24.01.2023 15:19

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

Спасибо! Раньше у меня был идентификатор, но я не думал о строке f, не знаю почему.

Kyle Christian 24.01.2023 13:42

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), как вы обновляете его в первую очередь, поскольку вы имеете дело только с с одним объектом здесь.

Другие вопросы по теме