javascript - Ajax 搜索功能在 django 应用程序中不起作用

标签 javascript jquery ajax django

我正在关注 Mike hibbert 的 tut 并尝试对其进行一些修改以满足我的需要,但它不起作用。我想用他的方式因为我的方式打破了 DRY 规则,我不得不为我的每个 View 编写搜索逻辑我认为这可能是我的 js 的顺序但我不认为它是。我可能是错的,因为我对编程还很陌生。我不确定,但我认为问题可能出在我的搜索在我在包含的导航中的导航上。这是我的代码

View .py

def search_title(request):
if request.method == "POST":
    search_text = request.POST['search_text']
else:
    search_text = ''

posts = Post.objects.filter(
    Q(title__contains=search_text)|
    Q(content__contains=search_text)
)
context = {
    "posts": posts
}
return render(request, "posts/ajax_search.html", context)

我的 nav.html

<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="{% url 'posts:list'  %}">HiSPANIC HEiGHTS</a>
    </div>
    <div id="navbar" class="collapse navbar-collapse">


      <form method="POST" action=" "  class="navbar-form navbar-right">
        <div class="input-group">{% csrf_token %}
          <input type="text" name="search" id="search" placeholder="search" value="{{ request.GET.q }}" class="form-control"
          style="width: 350px">

          <ul id="search-results">

          </ul>

        <span class="input-group-btn">
        <button type="submit" class="btn btn-primary"><span style="font-size:1.4em" class="glyphicon glyphicon-search"></span> </button>
        </span>
        </div>
      </form>

      <ul class="nav navbar-nav">
        <li><a href="{% url 'posts:list'  %}">Home</a></li>
        <li><a href="{% url 'posts:sewp'  %}">Sewp</a></li>
        {% if user.is_authenticated %}
        <li><a href="{% url 'admin:index' %}">Admin</a></li>
        <li><a href="{% url 'posts:create' %}">Create</a></li>
        {% endif %}

      </ul>
    </div><!--/.nav-collapse -->
  </div>

基础.html

{% load staticfiles %}
<html>
<head>
<title> {% block head_title %} try django 1.9 {% endblock head_title %}</title>

<link rel="stylesheet" href='{% static "css/base.css" %}'/>

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"
      integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css"
      integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">

{% include "includes/nav.html" %}



{% include "includes/messages_display.html" %}

<div class="container">

    {% if title == "posts" %}
    <div class="jumbotron" style="margin-top: 80px">
        {% block jumbotron %}{% endblock jumbotron %}
   </div>
    {% endif %}

    {% block content %}{% endblock content %}
</div>

<!-- Latest compiled and minified JavaScript -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"
integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS"
        crossorigin="anonymous">
</script>

<script src="{% static 'js/ajax.js' %}"></script>
<script src="{% static 'js/jquery.bootstrap-autohidingnavbar.js' %}"></script>

<script>
  $("nav.navbar-fixed-top").autoHidingNavbar();
</script>

ajax.js

 $(function(){

$('#search').keyup(function() {

    $.ajax({
        type: "POST",
        url: "/posts/search/",
        data: {
            'search_text': $('#search').val(),
            'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]").val()
        },
        success: searchSuccess,
        dataType: 'html'
    });
  });
  });

  function searchSuccess(data, textStatus, jqXHR)
  {
     $('#search-results').html(data);
  }

我的帖子/urls.py

urlpatterns = [
url(r'^$',   post_list, name='list'),
url(r'^tag/(?P<slug>[\w-]+)/$', tag_list, name="tag_list"),
url(r'^create/$', post_create, name='create'),
url(r'^sewp$', sewp, name='sewp'),
url(r'^(?P<slug>[\w-]+)/$', post_detail, name='detail'),
url(r'^(?P<slug>[\w-]+)/edit/$', post_update, name='update'),
url(r'^(?P<id>\d+)/delete/$', post_delete, name='delete'),
url(r'^search/', search_title),
]

我没有看到网络中有任何错误,我已经从 GET 和 POST 来回切换,只是试图调整一些东西让它工作,但没有任何改变。我的 jquery 来自 CDN,但我认为这不是问题,但我是新手,可能是错的。对此的任何帮助将不胜感激

最佳答案

将您的 search url 定义移动到 urlpatterns 列表的顶部,这样它就不会被 post_detail 通配符掩盖:

urlpatterns = [
    url(r'^$',   post_list, name='list'),
    url(r'^search/', search_title),
    url(r'^tag/(?P<slug>[\w-]+)/$', tag_list, name="tag_list"),
    url(r'^create/$', post_create, name='create'),
    url(r'^sewp$', sewp, name='sewp'),
    url(r'^(?P<slug>[\w-]+)/$', post_detail, name='detail'),
    url(r'^(?P<slug>[\w-]+)/edit/$', post_update, name='update'),
    url(r'^(?P<id>\d+)/delete/$', post_delete, name='delete'),
]

来自docs :

Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.

并且您的 post_detail 正则表达式肯定匹配 search/

关于javascript - Ajax 搜索功能在 django 应用程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156864/

相关文章:

javascript - 区分移动键盘上的keyup

jquery - 使用 Jquery 在 xml 中查找节点

javascript - 图片未在 Firebase 中保存名称

javascript - 单击 a href 时 Jquery Ajax 调用将数据发送到方法

javascript - HTML/Javascript addEventListener Onchange 事件在 Onchange 中?

javascript - JQuery 3.4.1 无法读取未定义的属性 'value'

javascript - Lodash 从嵌套对象中提取值

jquery - 向上或向下移动滚动条

javascript - 如何在对象[object HTMLCollection]上插入Mysql数据文本

jquery - 使用 jquery 进行多个 ajax 请求