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

0
Roma 31 Авг 2017 в 16:00

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)
2
Alasdair 31 Авг 2017 в 13:19

Вы должны определить метод post, но вы всегда можете установить метод формы на GET. Это даже более правильный способ для окна поиска, потому что GET используется для получения данных, POST для предоставления данных, которые сервер должен хранить или что-то еще, PUT для обновления данных. Таким образом, вы должны использовать GET в качестве метода формы. Также, если вы используете GET в качестве метода, кнопки браузера вперед и назад также будут содержать параметры 'lat', 'long', поэтому у вас будут работать кнопки назад и вперед. Генерация ссылок не потребуется.

1
sshopov 31 Авг 2017 в 13:22

У вас есть форма в html, но ваше представление обрабатывает только запросы, вы должны обновить ее и наследовать FormView или добавить функцию post со всем кодом обработки формы.

1
Anshul 31 Авг 2017 в 13:24