Как сделать пользовательский поиск с помощью метода post в django
Я новичок в django. Моя проблема в том, что я хочу осуществлять поиск по URL, например http://127.1.8000/shop/search/queryask шаблон Я не хочу использовать запрос со знаком вопроса, например ?q=abcd Может ли кто-нибудь подсказать мне, как это сделать в url, view и файлах шаблона django. Спасибо
Вы можете сделать это через пару довольно произвольных kwargs, хотя я бы сам так не делал (я бы использовал GET и request.GET)
Всего: url
path('mysearch/<int:pk>/<str:foo>/<str:bar>/',
MySearchPostView.as_view(), name='whatever'),
Вам может понадобиться или не понадобиться pk для указания конкретной сущности, которая будет участвовать в поиске, заданном foo и bar
view: любой CBV, соответствующий вашим целям. Это может быть, например, FormView
, который проверяет, что поля пользователя foo
и bar
имеют смысл в вашем контексте, а затем что-то делает. (Вполне возможно, что в этом случае вам не понадобится pk
)
class MySearchPostView( FormView):
#usual declarations template_name, form_class, etc.
def form_valid( self, form):
foo = self.kwargs.get( 'foo')
bar = self.kwargs.get( 'bar')
# and stuff that was POSTed through the form
baz = form.cleaned_data.get( 'baz')
# now process these entities and decide whether they make sense together
if ( conditions): # if they are valid together
return HttpResponseRedirect(
reverse( 'myapp:some_other_view', kwargs={
...
}
))
else:
# add a non-field error
form.add_error('', f"foo={foo} and bar={bar} are not valid together with baz={baz} )
return self.form_invalid( form)
Если недействительное состояние указывает на ошибку программирования JS, а не на ошибку пользовательского ввода, вы можете вместо этого return HttpResponseServerError( messsage)
(для кода Http-ответа 500)
Шаблон: вы предположительно будете использовать некий JS или что-то подобное для генерации POST на URL с автоматически сгенерированными значениями foo
и bar
. Отображение формы будет абсолютно стандартным. {{form.as_p}}
будет достаточно для целей разработки. JS будет специфичен для конкретного приложения и выходит за рамки этого вопроса, не зная ничего о проблеме, которую нужно решить.