Пространство в url Django
Я создаю строку поиска на своем сайте, все в порядке, если я передаю имена без пробелов, будучи, что я передаю слово строки поиска непосредственно в url, как вы можете себе представить, проблема возникает, когда пользователь вводит слова с пробелом. Я также конвертирую url в utf-8, но я думаю, что django делает это автоматически, потому что даже без конвертации в url, если вы передаете пробел, он появляется в его post% 20, я хотел уточнить, что проблема сохраняется, если вы вводите символы типа:! Кто-нибудь может мне помочь? Заранее спасибо.
urls.py:
from django.urls import path
from dac import views
from django.conf.urls.static import static
from django.conf import settings
from django.urls import re_path #include
from django.contrib import admin
app_name = 'dac'
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='index'),
path('doctors/<slug:slug>', views.doctor, name='doctors'),
path('doctors/search/<slug:slug>/<slug:slug2>', views.doctor_search, name='doctors_search'),
re_path(r'^doctors_search/search/(?P<slug>.)/(?P<slug2>\d+)$', views.doctor_search, name='doctors_search'),
path('<slug:slug>', views.doctor_detail, name='doctor_detail'),
path('signup/', views.sign_up, name="sign_up"),
path('login/', views.log_in, name='log_in'),
path('logout/', views.log_out, name='log_out'),
path('reports/', views.reports, name='reports'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py:
def doctor(request, slug):
print("slug: ",slug)
if request.method == 'POST':
print("slug: ",slug)
risposta=request.POST.get("textAnswer")
risposta=risposta.upper()
risposta_list=risposta.rsplit()
print(risposta_list)
actual_url=request.build_absolute_uri()
url=re.sub("\d+$", "search/%s/1"%(risposta), actual_url)
return HttpResponseRedirect(url.encode('utf-8'))
slug=int(slug)
max_slug=int(round(doctors.objects.count()/28,0))
if slug==1:
prew_slug=slug
else:
prew_slug=slug-1
if slug==max_slug:
nxt_slug=max_slug
else:
nxt_slug=slug+1
doc_list=doctors.objects.all()[(slug-1)*28:slug*28]
{"doc_list":doc_list}
return render(request, 'dac/doctors.html', locals())
def doctor_search(request, slug, slug2):
slug2=int(slug2)
print("slug1: ",slug)
print("slug2: ",slug2)
if request.method=="POST":
risposta=request.POST.get("textAnswer")
risposta=risposta.upper()
actual_url=request.build_absolute_uri()
url=actual_url.replace(slug, risposta)
return HttpResponseRedirect(url.encode('utf-8'))
slug=urllib.parse.unquote(slug)
doc_list=doctors.objects.filter(frst_nm=slug) | doctors.objects.filter(lst_nm=slug) | doctors.objects.filter(pri_spec=slug)
if doc_list.count()==0:
messages.error(request, "no result")
max_slug=int(round(doc_list.count()/28,0))
if slug2==1:
prew_slug=slug2
else:
prew_slug=slug2-1
if slug2==max_slug:
nxt_slug=max_slug
else:
nxt_slug=slug2+1
doc_list=doc_list.all()[(slug2-1)*28:slug2*28]
{"doc_list":doc_list}
return render(request, 'dac/doctors_search.html', locals())
Использование :
<str:var>
вместо :
<slug:var>
path('doctors/search/<str:slug>/<str:slug2>', views.doctor_search, name='doctors_search'),