2017-08-31 105 views
0

这个想法是显示一个搜索框,用户可以在其中键入地址,该地址由Google自动填充完成。然后,我们保存lat和long参数并重定向到/search(使用POST)或(可能使用GET请求)或者/search?lat=xxx&long=xxx带有另一个页面上的表单动作的POST请求返回405,不处理请求。POST

对于第二种情况,与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值,Lngcityname。提交后,他们将被重定向到/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来填充XXX莫名其妙

+0

您是否在视图中定义了Post方法? – WebGuy

+0

我认为这可能是问题...让我检查 – Roma

+0

此响应代码(405)可能来自任何数量的问题,但通常最终会导致您使用的URL错误或使用错误的请求方法。 – WebGuy

回答

2

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) 
+0

谢谢!你会推荐使用GET还是POST更好? – Roma

+0

由于您没有修改数据,因此对于此搜索表单,GET请求可以正常使用。 – Alasdair

+0

还有一件事,我应该向forms.py添加一个表单并验证它是否类似于https://docs.djangoproject.com/en/1.11/topics/forms/#the-view – Roma

1

必须定义POST方法,但你总是可以设置窗体的方法得到的。这甚至是搜索框更正确的方式,因为GET用于获取数据,POST用于提供服务器必须存储的数据或其他内容,PUT用于更新数据。所以你应该使用GET作为你的表单方法。此外,如果您使用GET作为方法,则浏览器的前后按钮也将包含'lat','long'参数,因此您可以使用后退和前进按钮。不需要链接生成。

1

您在html中有一个表单,但您的视图只能处理获取请求,您必须更新它并继承FormView或在所有表单处理代码中添加post函数。