这个想法是显示一个搜索框,用户可以在地址中输入该搜索框,而该地址通过Google AutoComplete完成。然后,我们将LAT和长参数保存,然后重定向到/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,长。但是,当表单操作为/users/
时,它给了我405的错误。
是可能的,或者我需要做一个get请求,例如将URL参数作为链接传递,因此我将只有一个链接,而不是表单:
users?lat=xxx&long=xxx
我必须使用JS以某种方式填充xxx
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)
您必须定义帖子方法,但是您始终可以设置获得表单方法。对于搜索框来说,这甚至是更正确的方法,因为GET用于获取数据,发布服务器必须存储或其他内容的数据,PUT是更新数据。因此,您应该使用获取作为表单方法。另外,如果您使用get作为方法,则浏览器向后和向前的按钮还将包含" lat","长"参数,因此您将进行后退按钮。不需要链接生成。
您在HTML中具有表单,但是您的视图只需获取请求,您必须更新它并继承FormView或使用所有表单处理代码添加Post函数。