Динамическая маршрутизация URL из html-формы внутри экшена в Django
У меня есть простая форма, которая должна принимать пользовательский ввод и напрямую отправлять пользователя на динамический url, используя этот ввод. Если ввести в форму "111", то пользователь попадет на страницу /number_input=111
Почему-то у меня это не получается, так как я не знаю, как получить прямое значение переменной из формы в представление сразу. Я могу построить его с 2 представлениями, но это выглядит как-то некрасиво и неудобно
Вот что у меня есть на данный момент:
Форма: (внутри index.html)
<form action={% url 'my_view'%} method="POST">
{% csrf_token %}
<p><input type="text" name="inp_number" placeholder="Insert Number"/></p>
<p><input type="submit" value="Submit"/></p>
</form>
views.py:
def number_view(request):
if request.method == 'POST':
context = {'number': request.POST['inp_number']}
return render(request, 'number.html', context)
urls.py
from . import views
urlpatterns = [
path('number_input=<int:number>/', views.number_view, name='number_view')
]
Динамическая часть (int:number) сделает код неудачным, так как я не отправляю значение из формы, верно? Но я знаю только как отправлять статические значения (т.е. action={% url 'my_view' 111 %}). Как я могу отправить прямое динамическое значение из самой формы (значение, которое пользователь вводит в кнопку отправки)?
number.html
<h2>This page is for number {{ number }}</h2>
Вы можете перенаправить пользователя на правильный URL с помощью redirect.
from django.shortcuts import redirect
def number_view(request):
if request.method == 'POST':
sent_number = request.POST['inp_number']
return redirect('number_view', number=sent_number)
return render(request, 'number.html', context)
Это должно работать:
from django.shortcuts import redirect
def number_view(request, number):
if request.method == 'POST':
number = int(request.POST('inp_number'))
return redirect('url', number=number)
return render(request, 'number.html', {'number': number})
urls.py
urlpatterns = [
path('number_input=<int:number>/', views.number_view, name='number_view')
]
и ваша форма:
<form method='POST'>
{% csrf_token %}
<p><input type="text" name="inp_number" placeholder="Insert Number"/>
</p>
<p><input type="submit" value="Submit"/></p>
</form>