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