Django Ajax 搜索不起作用

Posted

技术标签:

【中文标题】Django Ajax 搜索不起作用【英文标题】:Django Ajax search will not work 【发布时间】:2014-10-07 01:00:27 【问题描述】:

我一直在关注本教程: https://www.youtube.com/watch?v=jKSNciGr8kY

我完全被卡住了,我已经逐行检查了我的代码,但仍然无法找出问题所在。每当我搜索文件时,它总是返回 No Documents available!!而不是我正在搜索的文档。

这是它的视图:

 def search(request):

      if request.method == 'POST':    
           search_text = request.POST['search_text']

      else:
           search_text = ''

      if search_text:
           documents = Document.objects.filter(document_subject__contains=search_text,           approved=True)

      else:
           documents = False

   return render(request,'ajax_search.html','documents':documents)

这是我的 ajax_search 模板:

 % if documents.count > 0 %

 % for document in documents %
 <li><a href="/main/get/ document.id /"> document.document_subject </a></li>
 % endfor %

 % else %

 <li> None to show!!</li>

 % endif %

我的 ajax 文件:

$(function ()

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

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

    );

);

function searchSuccess(data, textStatus, jqXHR)

    $('#search-results').html(data);

这是在我的 base.html 文件中:

 <script type="text/javascript" src=" STATIC_URL  /static/jquery-2.1.1.min.js">   </script>
 <script type="text/javascript" src=" STATIC_URL  /static/ajax.js"></script>

我的文档模型:

class Document(models.Model):

    docfile = models.FileField(upload_to='documents/%Y/%m/%d')
    document_subject = models.CharField(max_length=255)
    document_subject_number = models.PositiveIntegerField(max_length=999)

    def __unicode__(self):
      return self.document_subject

    def get_absolute_url(self):
      return "/main/get/%i/" %self.id

如果您有任何其他问题,请提前告诉我,谢谢,我是 python 和 django 的新手,所以我很感激任何反馈。提前致谢

搜索部分模板:

<ul>
  <li><a href='/documents/all'>Documents</a></li>
  <li><a href='documents/create'>Create Documents</a></li>
</ul>
<h3>Search</h3>
% csrf_token %
<input type ='text' id="search" name="search"/>
<ul id="search-results">

</ul>

【问题讨论】:

你需要做一些调试。例如,使用 Python 中的日志语句来确定它是否进入了“搜索”视图;如果它得到你期望的查询参数;或者如果它在那时返回任何文件。然后转到 Javascript,再次使用 console.log 来查找那里发生的事情。 很多可能的问题尝试查看是否正确执行了 javascript 在视图上打印 'search_text',只需在 if search_text: 之前添加 print search?text 并检查终端中的输出 能否也粘贴模板的搜索部分?你的csrf真的在那里吗? firebug / 开发者工具的响应是什么? 谢谢我做了一些调试,我添加了模板的搜索部分。 【参考方案1】:

你只是在获取数据,没有理由使用 POST,只需使用 GET。

$(function ()

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

        $.ajax(
            type: 'GET',
            url: '/main/search/',
            data: search_text:$('#search').val(),
            success: function(newData) 
                $('#search-results').html(newData);
            
        );

    );

);

编辑:您过滤了您的问题中的已批准,但我在您的模型中没有看到已批准的字段。我已从以下视图中的过滤中删除已批准以遵循您的模型 重构了你的视图,不需要那么多代码。

def search(request):

    documents = None

    """
    request.GET.get will always return the value of the key if set or None (you can alternatively specify a default return value).
    """
    search_text = request.GET.get('search_text')

    if search_text :
        """
        Use some try, catch we don't need the server to fail because of a search action...
        """
        try:
            documents = Document.objects.filter(document_subject__contains=search_text)
        except:
            pass

    return render(request, 'ajax_search_html','documents':documents)

您可以在视图中添加:if request.is_ajax() 以检查这是否是一个 ajax 请求,但由于您的视图感觉是否在执行相同的 ajax,我认为没有理由。

模板:

% if documents %
    % for document in documents %
        <li><a href="/main/get/ document.id /"> document.document_subject </a></li>
    % endfor %

 % else %
    <li> None to show!!</li>
 % endif %

【讨论】:

非常感谢你让我开心,我成功了,你真的不知道你让我有多开心。

以上是关于Django Ajax 搜索不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 发布请求在 django 中不起作用

使用 AJAX 的 Django POST 不起作用

使用 Ajax 的按钮在 Django 项目中不起作用

带有ajax的Django过滤器功能不起作用

使用 django ajax jquery 提交一个文件不起作用的表单

Datatables Ajax 在从文件中读取 JSON 时起作用,但从变量中读取 JSON 时不起作用(Django)