• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Django利用AJAX技术实现博文实时搜索

    学习Python Web和Django开发不能只学习Python。我们有时必需借助其它技术比如AJAX实现我们想要的功能。今天我们就要利用Django 2.0 + AJAX开发一个功能性页面: 我们一边输入关键词,网页一边会给你提示所找到的博文数量。

    什么是AJAX技术?它的应用场景有哪些?

    Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    Ajax常见应用场景包括:

    以上场景都是Django单靠自己无法实现的。注意Ajax应只用于与服务器少量数据交换,且存安全隐患,不宜广泛使用。

    总体开发思路

    我们创建一个叫blog的APP,并把它加入到INSTALLED_APP里去,然后在后台添加一些文章, 用于搜索(如下所示)。我们需要设计2个功能性页面: 一个展示博客文章清单,一个搜索页面。

    下面我们来看下具体代码。

    models.py

    本案例中所用到的Article模型代码如下: 

    from django.db import models
    from django.contrib.auth.models import User
    from django.urls import reverse
    from django.utils.timezone import now
    
    
    class Article(models.Model):
    
        STATUS_CHOICES = (
            ('d', '草稿'),
            ('p', '发表'),
        )
    
        title = models.CharField('标题', max_length=200, unique=True)
        slug = models.SlugField('slug', max_length=60)
        body = models.TextField('正文')
        pub_date = models.DateTimeField('发布时间', default=now, null=True)
        create_date = models.DateTimeField('创建时间', auto_now_add=True)
        mod_date = models.DateTimeField('修改时间', auto_now=True)
        status = models.CharField('文章状态', max_length=1, choices=STATUS_CHOICES, default='p')
        views = models.PositiveIntegerField('浏览量', default=0)
        author = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.title
    
        class Meta:
            ordering = ['-pub_date']
            verbose_name = "文章"

    urls.py

    前文提到过我们需要设计2个功能性页面: 一个展示博客文章清单,一个搜索。然而在urls.py里我们却设计了3个URL。这是因为我们还要设计一个URL与AJAX进行后台数据交换。这是用户看不见的,后面我们会用到这个URL。当ajax发送请求到/blog/ajax/search/时,Django就会调用ajax_search方法来处理。

    from django.urls import path, re_path
    from . import views
    
    # namespace
    app_name = 'blog'
    
    urlpatterns = [
    
        # 搜索文章
        re_path(r'^search/$', views.article_search, name='article_search'),
    
        # 用于与ajax交互
        re_path(r'^ajax/search/$', views.ajax_search, name='ajax_search'),
    
        # 展示所有文章
        path('', views.ArticleListView.as_view(), name='article_list'),
    
    ]

    views.py

    对应3个URL,我们需要在视图里编写3个处理方法,其中ajax_search用来给搜索页面返回Json数据(查询到的文章数量)。article_search方法用来返回搜索结果。我们为什么不用ajax_search返回搜索结果呢?因为查询到的数据集可能非常大,而ajax方法一般仅应用于与服务器的少量数据交换。

    from django.views.generic import ListView
    from .models import Article
    from django.shortcuts import render
    from .forms import SearchForm
    from django.http import JsonResponse
    
    
    # Create your views here.
    class ArticleListView(ListView):
        queryset = Article.objects.filter(status='p').order_by('-pub_date')
        paginate_by = 6
    
    
    def article_search(request):
        if request.method == 'GET':
            form = SearchForm(request.GET)
            if form.is_valid():
                keyword = form.cleaned_data.get("keyword")
                if keyword:
                    article_list = Article.objects.filter(title__icontains=keyword)
                    return render(request, 'blog/search.html', {'form': form, 'article_list': article_list})
        else:
            form = SearchForm()
    
        return render(request, 'blog/search.html', {'form': form, 'article_list': False, })
    
    
    def ajax_search(request):
        if request.method == 'GET':
            keyword = request.GET.get('keyword', None)
            if keyword:
                count = Article.objects.filter(title__icontains=keyword).count()
                data = {'count': count, }
                return JsonResponse(data)
    

    我们着重看下ajax_search是如何工作的。

    模板blog/search.html

    我们的模板blog/search.html代码如下:

    {% block content %}
    h3>Django Ajax实时搜索文章/h3>
    
    form method="get" action="">{% csrf_token %}
        {{ form }}
        input type="submit" value="Search" />
    /form>
    {% endblock %}
    
    
    div id="result">/div>
    
    script src="https://code.jquery.com/jquery-3.1.0.min.js">/script>
    script>
        $("#id_keyword").bind('input propertychange', function() {
          var keyword = $(this).val();
    
          $.ajax({
            url: '/blog/ajax/search/',
            data: {
              'keyword': keyword
            },
            type: 'GET',
            dataType: 'json',
            success: function (data) {
            $("#result").html("p>正在实时查询...共" + data.count + "条记录/p>")
            },
    
          });
        });
      /script>
    
    
    {% if article_list %}
    p>共找到 {{ article_list | length }} 条记录。/p>
       ul>
        {% for article in article_list %}
       li>a href="{% url 'blog:article_detail' article.id %}" rel="external nofollow" > {{ article.title }}/a> {{ article.pub_date | date:"Y-m-j" }}/li>
        {% endfor %}
       /ul>
    {% endif %}

    我们着重看下Ajax如何工作的。

    查看效果

    下图是实时显示搜索结果数量的效果。随着关键词的增长,查询到的结果数量越来越少。

    以上就是Django利用AJAX技术实现博文实时搜索的详细内容,更多关于Django用AJAX实时搜索的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • Django如何与Ajax交互
    • Django与AJAX实现网页动态数据显示的示例代码
    • 使用AJAX和Django获取数据的方法实例
    • Django查询优化及ajax编码格式原理解析
    • 浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
    • django ajax发送post请求的两种方法
    • django框架中ajax的使用及避开CSRF 验证的方式详解
    • Django中ajax发送post请求 报403错误CSRF验证失败解决方案
    • Django结合ajax进行页面实时更新的例子
    • Django 通过JS实现ajax过程详解
    上一篇:python 如何获取页面所有a标签下href的值
    下一篇:Django给表单添加honeypot验证增加安全性
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Django利用AJAX技术实现博文实时搜索 Django,利用,AJAX,技术,实现,