2017-09-05 77 views
1

比方说,我有以下形式:Django的:将表单数据为“干净的URL”

<form id="search-form" class="form-horizontal" method="GET" action="/results/" role="form"> 
    <input type="text" class="form-control" id="query" name="query"> 

    <button type="submit" form="search-form" class="btn btn-primary"> 
     <span class="glyphicon glyphicon-search" aria-hidden="true"></span>  
    </button> 
</form> 

目前,提交表单时,URL包含查询作为参数,像这样:www.<my-domain>.com/results?query=<some-query>。但是,对于搜索引擎优化的目的,我想将其转换为'干净网址',看起来更像这样:www.<my-domain>.com/results/<some-query>

我做了以下修改我的urls.py:

urlpatterns = [ 
    ... 
    url(r'^results/(?P<query>[a-zA-Z ]+)$', views.ResultsView.as_view(), name="results"), 
    ... 
] 

所以我应该能够抓住查询值在我ResultsView这样的:

class ResultsView(TemplateView): 

    def dispatch(self, request, *args, **kwargs): 

     query = kwargs.get('query') 

我怎样才能提交表单,以便与相应的url模式匹配?我已经尝试过将表单动作传递给它的输入ID,如下所示:action="/results/query/",但很明显,它认为query是一个文字字符串,并且不会将其替换为输入的值。

+0

您需要使用JS,因为你不能输入值粘贴为URL字符串等的一部分这个'/查询/'/结果通过standart django方法 – AndMar

+0

@marni是的,这是有道理的。虽然我对JS并不是很了不起。如果你可以发布一个工作示例,我会将答案标记为正确。 – Sam

+0

即使你使用SEO的目的,你应该使用GET方法,更清洁和更容易 –

回答

1

你可以用JQuery轻松做到这一点。点击按钮时,防止默认操作,并在window.location.href中定义它应该重定向到的url。

<script> 
    $(document).ready(function() { 
     $("button").click(function (e) { 
      e.preventDefault(); 
      query = $("#query").val(); 
      window.location.href = location.origin + "/results/" + query; 
     }); 
    }); 
</script> 

不要忘记添加依赖

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"> 
+1

正是我在找什么。谢谢! – Sam