Идея состоит в том, чтобы отобразить окно поиска, где пользователь может ввести адрес, который заполняется автозаполнением Google. Затем мы сохраняем параметры lat и long и перенаправляем на /search
(используя POST) или (возможно, используем запрос GET) альтернативно /search?lat=xxx&long=xxx
.
Во втором случае с параметрами URL я мог бы использовать lat = request.GET('lat')
Моя форма Index.html
<form action="{% url 'users:index' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input id="searchTextField" type="text" size="50" placeholder="Enter a location" autocomplete="on" runat="server" />
<input type="hidden" id="cityname" name="cityname" />
<input type="hidden" id="Lat" name="Lat" />
<input type="hidden" id="Lng" name="Lng" />
<button type="submit">Submit</button>
</form>
Когда пользователь выбирает из выпадающего списка, JavaScript дает мне значения Lat
, Lng
и cityname
. После отправки они перенаправляются в /users/
, который является ListView и имеет следующий views.py
class IndexView(ListView):
# context_object_name = 'latest_teacher_list'
model = Teacher
def get_context_data(self, **kwargs):
if self.request.method == 'POST' and 'Lat' in self.request.POST:
if self.request.POST['Lat'] != '':
lat = self.request.POST['Lat']
else:
lat = None
else:
lat = None
context = super(IndexView, self).get_context_data(**kwargs)
context['teacher_list'] = Teacher.objects.all()[:5]
context['lat'] = lat
return context
Тем не менее, это дает мне пустую страницу, когда я отправляю форму. Когда form action
не заполнен, он отправляет форму на ту же страницу и правильно отображает Lat, Long. Но когда действие формы /users/
, это дает мне ошибку 405.
Это возможно, или мне нужно сделать запрос GET, например, передать параметры URL как ссылку, поэтому вместо формы у меня будет просто ссылка на:
users?lat=xxx&long=xxx
Где я должен использовать Js для заполнения ххх как-то
3 ответа
ListView
не имеет определенного метода post
, поэтому он вернет код состояния 405 для запросов на публикацию.
Вы можете определить метод post
, который просто вызывает метод представления get()
:
class IndexView(ListView):
...
def post(self, request, *args, **kwargs):
"""Allow post requests for form submissions"""
return super(IndexView, self).get(request, *args, **kwargs)
Вы должны определить метод post, но вы всегда можете установить метод формы на GET. Это даже более правильный способ для окна поиска, потому что GET используется для получения данных, POST для предоставления данных, которые сервер должен хранить или что-то еще, PUT для обновления данных. Таким образом, вы должны использовать GET в качестве метода формы. Также, если вы используете GET в качестве метода, кнопки браузера вперед и назад также будут содержать параметры 'lat', 'long', поэтому у вас будут работать кнопки назад и вперед. Генерация ссылок не потребуется.
У вас есть форма в html, но ваше представление обрабатывает только запросы, вы должны обновить ее и наследовать FormView или добавить функцию post со всем кодом обработки формы.
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.