在另一页上具有表单操作的 POST 请求返回 405,不处理请求。发布



这个想法是显示一个搜索框,用户可以在地址中输入该搜索框,而该地址通过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为我提供了LatLngcityname的值。提交后,它们被重定向到/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函数。

最新更新