Как добавить url к вводу из формы в html-шаблоне?

У меня есть строка поиска на главной странице (http://127.0.0.1:8000/wiki/), где я хочу, чтобы пользователи могли искать записи и получать их по url. Таким образом, если пользователь ищет css в строке поиска, он будет перенаправлен на /wiki/css (/wiki нужно оставить прежним). Когда что-то ищется, url остается тем же самым, поэтому он не перенаправляется или может быть перенаправлен на ту же самую страницу.

Как добавить поисковый запрос к url, не используя другой url?

HTML:

<h2>Wiki</h2>
<form action="/wiki/" method="post">
    {% csrf_token %}
    <input class="search" type="text" name="q" placeholder="Search Encyclopedia">
</form>

urls.py:

urlpatterns = [
    ...
    path('<str:name>', views.wiki_lookup, name='wiki-lookup'),
]

views.py:

from django.shortcuts import render, redirect, HttpResponse

def wiki_lookup(request):
    term = request.POST.get('q', 'notfound')
    return redirect('entry', name=term)

Из документации по redirect, https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#redirect есть три способа использования redirect.

obj = MyModel.objects.get(...)
return redirect(obj)

или

return redirect('some-view-name', foo='bar')

или

return redirect('/some/url/')

Вы используете второй вариант, где 'entry' ожидается как имя другого представления (определенного в views.py и включенного в urls.py). Что-то вроде

urls.py:

urlpatterns = [
    ...
    path('wiki/', views.wiki_lookup, name='wiki-lookup'),
    path('wiki/<slug:term>/', views.EntryDetailView.as_view(), name='entry'),
]

views.py:

from django.views.generic.detail import DetailView

class EntryDetailView(DetailView):
    model = Entry

Я использовал представление на основе класса, но вы можете использовать функцию представления, которая ищет Entry, если хотите.

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