Как перенаправить на динамический URL-адрес в django

Я работаю над проектом django. в проекте у меня есть динамический URL следующим образом

app_name = 'test'

urlpatterns = [
    path('root', views.root, name='root'),
    path('output/<str:instance>', views.output_page, name='output_page'),
]

В приложении существует две страницы. На странице root существует форма, которая при отправке должна перенаправлять на страницу output_page. Но поскольку output_page является динамическим URL-адресом, я не могу перенаправить.

Вот мой файл представлений

def root(request):
    if request.method == 'POST':

        name = request.POST.get('name')
        job = request.POST.get('job')

        return redirect("test:output_page")

    return render(request, 'test/root.html')

def output_page(request, instance):

    record = Object.objects.all(Instance_id=instance)

    return render(request, 'test/output_page.html', {'record': record})

Вот модель

class Object(models.Model):
    Name = models.CharField(max_length=200, null=True, blank=True)
    Job = models.CharField(max_length=200, default="")
    Instance_id = models.CharField(max_length=200)

Когда происходит перенаправление, я хочу, чтобы URL-адрес был следующим

http://127.0.0.1:8000/output/test-001

где test-001 — это instance_id в модели.

Страница output_page должна фильтровать все данные в модели с instance_id test-001


person Sashaank    schedule 08.09.2020    source источник
comment
Отвечает ли это на ваш вопрос? Django и urls.py: как HttpResponseRedirect через именованный URL?   -  person pygeek    schedule 08.09.2020


Ответы (2)


Решение

Прямое решение вашего вопроса будет следующим:

from django.urls import reverse
from django.shortcuts import get_object_or_404
...
instance = get_object_or_404(Object, name=name, job=job)
redirect(reverse('test:output_page', args=instance))

Тем не менее, стоило бы исследовать представления, основанные на классах. Я рекомендую использовать встроенный в django RedirectView для этой цели.

Рекомендации

Django Reverse: https://docs.djangoproject.com/en/3.1/ref/urlresolvers/

Django RedirectView: https://docs.djangoproject.com/en/3.1/ref/class-based-views/base/#redirectview

person pygeek    schedule 08.09.2020
comment
Спасибо за ответ. Теперь я получаю эту ошибку output_page() missing 1 required positional argument: 'instance' - person Sashaank; 08.09.2020
comment
Вы можете передать аргументы и kwargs для обратной функции. Я обновил свой ответ, чтобы отразить это, но это также отмечено в справочной документации. - person pygeek; 08.09.2020
comment
Привет. Теперь я получаю эту ошибку Reverse for 'output_page' with no arguments not found. 1 pattern(s) tried: ['output/(?P<instance>[^/]+)$'] - person Sashaank; 08.09.2020
comment
Вы должны убедиться, что экземпляр существует и передан перед перенаправлением. - person pygeek; 08.09.2020
comment
Привет. Я решил ошибку. Я сделал ссылку на страницу в шаблоне. Как только я удалил это, ошибка была устранена. Большое спасибо - person Sashaank; 08.09.2020

Вы можете сделать так

return redirect(reverse("test:ouput_page",kwargs={'instance':str(instance_id)}))

person Adithya    schedule 08.09.2020
comment
Привет. Теперь я получаю эту ошибку Reverse for 'output_page' with no arguments not found. 1 pattern(s) tried: ['output/(?P<instance>[^/]+)$'] - person Sashaank; 08.09.2020
comment
instance задается в виде строки в URL-адресе, поэтому вам нужно отправить str(instance_id) в kwargs - person Adithya; 08.09.2020
comment
Привет. Я решил ошибку. Я сделал ссылку на страницу в шаблоне. Как только я удалил это, ошибка была устранена. Большое спасибо - person Sashaank; 08.09.2020