Можно ли сделать так, чтобы вход из формы в html-шаблоне добавлялся к url в проекте django?

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

Когда я использую метод get в форме, он заканчивает поиск на /wiki/?q=css вместо того, чтобы просто иметь /css в конце url. Однако, когда я использую метод post в форме, url остается на http://127.0.0.1:8000/wiki/ без дополнительного 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:

from tokenize import Name
from unicodedata import name
from django.urls import path

from django.http import HttpResponse

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path('hello/', views.hello, name='hello'),
    path('<str:name>', views.entry, name='entry'),
    path('new/', views.new, name='new'),
    path('random/', views.randomEntry, name='random')
]

views.py:

from django.shortcuts import render
from django.http import HttpResponse
from django import forms
import random

from . import util


def index(request):
    return render(request, "encyclopedia/index.html", {
        "entries": util.list_entries()
    })


def hello(request):
    return HttpResponse('Hello, world')


def entry(request, name):
    return HttpResponse(util.get_entry(name))


def search(name):
    value = util.get_entry(name)
    if value != None:
        return value


class searchForm(forms.Form):
    search = forms.CharField(label='Search Encyclopedia')
    # this was not used as I do not know if it would be useful


def new(request):
    return render(request, "encyclopedia/new.html", {
        "entries": util.list_entries()
    })


def randomEntry(request):
    list = []
    for i in util.list_entries():
        list.append(i)
    num = random.randint(0, len(list)-1)
    page = list[num]
    return render(request, f"entries/layout.html", {
        "entries": util.list_entries()
    })

util.py (не знаю, полезно ли это, но можно использовать):

import re
from django.core.files.base import ContentFile
from django.core.files.storage import default_storage


def list_entries():
    """
    Returns a list of all names of encyclopedia entries.
    """
    _, filenames = default_storage.listdir("entries")
    return list(sorted(re.sub(r"\.md$", "", filename)
                for filename in filenames if filename.endswith(".md")))


def save_entry(title, content):
    """
    Saves an encyclopedia entry, given its title and Markdown
    content. If an existing entry with the same title already exists,
    it is replaced.
    """
    filename = f"entries/{title}.md"
    if default_storage.exists(filename):
        default_storage.delete(filename)
    default_storage.save(filename, ContentFile(content))


def get_entry(title):
    """
    Retrieves an encyclopedia entry by its title. If no such
    entry exists, the function returns None.
    """
    try:
        f = default_storage.open(f"entries/{title}.md")
        return f.read().decode("utf-8")
    except FileNotFoundError:
        return None

Пусть ваша форма ввода отправляется в новое представление, которое извлекает значение поля, а затем перенаправляет на запись в вики, основанную на этом значении

html

<h2>Wiki</h2>
<form action="/wiki-lookup/" method="post">

views.py

def wiki-lookup(request):
    #first we get the posted q term, or return 'notfound' if the form fails to provide a value
    term = request.POST.get('q', 'notfound')
    #....test term for validity here as appropriate
    #next redirect to 'entry' passing the term as the name value for that URL
    return redirect('entry', name = term)

urls.py

...
path('wiki-lookup/', views.wiki-lookup, name='wiki-lookup'),

Django на самом деле довольно аккуратен в том, что представления не обязательно должны быть реальными страницами - они могут просто выполнять некоторую работу, чтобы определить, на какой странице пользователь должен оказаться.

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