首页 > 其他分享 >Django项目中Ajax的应用,博客分类文章阅读,左右栏目自动更新

Django项目中Ajax的应用,博客分类文章阅读,左右栏目自动更新

时间:2024-07-15 09:11:53浏览次数:5  
标签:category models posts Django Ajax html 自动更新 post id

从数据库读取博客分类数据,放到左侧栏目,右侧栏目根据左侧点击的博客分类名进行自动更新对应的所有分类博客文章,在右侧显示出来.

models.py定义的博客数据库

from django.db import models
from django.contrib.auth.models import User


class Post(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    create_date = models.DateTimeField(auto_now_add=True)
    published_date = models.DateTimeField(null=True, blank=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True, blank=True)
    tags = models.ManyToManyField('Tag', blank=True)

    def __str__(self):
        return self.title


class Category(models.Model):
    name = models.CharField(max_length=255)


class Tag(models.Model):
    name = models.CharField(max_length=255)

浏览器入口代码

<li class="nav-item">
	<a class="nav-link" href="blog/blog_list/" target="_blank">test2</a>
</li>

路由文件路径blog\urls.py代码

   path('blog_list/', views.blog_list, name='blog_list'),

视图文件blog\views.py代码

def blog_list(request):
    categories = Category.objects.all()
    posts = Post.objects.all()  # 初始情况下获取所有文章

    # 检查请求中是否包含分类 ID
    category_id = request.GET.get('category_id')
    if category_id:
        # 根据选定的分类过滤文章
        posts = posts.filter(category_id=category_id)

    # 渲染模板,并传递过滤后的文章和分类数据
    return render(request, 'test2.html', {'posts': posts, 'categories': categories})


def get_posts(request):
    category_id = request.GET.get('category_id')
    posts = Post.objects.filter(category_id=category_id)

    # 构造返回的数据
    posts_data = [{'title': post.title, 'published_date': post.published_date} for post in posts]
    return JsonResponse(posts_data, safe=False)

html页面test2.html实现代码

{% extends 'header.html' %}
{% load static %}
{% block content %}
	<h1>文章列表</h1>
	<ul>
		{% for post in posts %}
			<li>{{ post.title }}</li>
		{% empty %}
			<p>没有找到文章</p>
		{% endfor %}
	</ul>
	<ul>
		{% for category in categories %}
			<li>{{ category.name }}</li>
		{% empty %}
			<p>没有找到文章分类</p>
		{% endfor %}
	</ul>
	<div>test2.html</div>
	<div class="container">
        <div class="row">
            <!-- 左边分类栏 -->
            <div class="col-md-4">
                <h2>文章分类</h2>
                <ul id="category-list">
                    {% for category in categories %}
						<li data-id="{{ category.id }}">{{ category.name }}</li>
					{% endfor %}
                </ul>
            </div>

            <!-- 右边文章栏 -->
            <div class="col-md-8">
                <h2>文章列表</h2>
                <div id="post-list">
					{% for post in posts %}
						<div>
							<h3>{{ post.title }}</h3>
							<p>{{ post.published_date }}</p>
						</div>
					{% empty %}
						<p>没有找到文章</p>
					{% endfor %}
                </div>
            </div>
        </div>
    </div>
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script>
// 使用jQuery获取分类列表并绑定点击事件
$(document).ready(function() {
    $('#category-list').on('click', 'li', function () {
        let categoryId = $(this).data('id');

        // 使用 AJAX 获取过滤后的文章
        $.ajax({
            url: '/blog/get_posts/', // 替换为你的Django视图URL
            type: 'GET',
            data: {'category_id': categoryId},
            success: function (data) {
                let html = '';
                data.forEach(function (post){
                    html += '<div><h3>' + post.title + '</h3><p>' + post.published_date + '</p></div>'
				});
                if (!data.length) {
                    html = '<p>没有找到文章</p>';
				}
                $('#post-list').html(html); // 更新文章列表// 假设 'data' 包含模板渲染后的 HTML 内容
            },
            error: function (xhr, status, error) {
                console.error('AJAX请求失败:', error);
            }
        });
    });
});
</script>

{% endblock %}

Ajax实现更新的html页面文件get_posts.html代码

之前错误找了很久的错误,原来是get_post写成了get-post,一个符号的错误导致整个页面不能运行

<!-- get_posts.html -->
{% for post in posts %}
    <div>
        <h3>{{ post.title }}</h3>
        <p>{{ post.published_date }}</p>
    </div>
{% empty %}
    <p>没有找到文章</p>
{% endfor %}

标签:category,models,posts,Django,Ajax,html,自动更新,post,id
From: https://www.cnblogs.com/aiparallelworld/p/18302396

相关文章

  • 【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块
    文章目录前言一、导航功能实现a.效果图:b.后端代码c.前端代码二、轮播图功能实现a.效果图b.后端代码c.前端代码三、标签栏功能实现a.效果图b.后端代码c.前端代码四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码3.侧边栏展示分类及课程......
  • Django核心面试题
    Django核心面试题Django核心面试题Django核心面试题1.Django的MVT架构是什么?2.如何创建Django项目和应用?3.DjangoORM是什么?4.什么是Django的middleware?举例说明。5.Django中的静态文件如何处理?6.如何定义Django模型?7.什么是Django的QuerySet?如何......
  • 在 Linux 中的 Nginx 上部署 Django 项目
    要在Linux中的Nginx上部署Django项目,一般需要以下步骤:安装必要的软件安装Python和相关依赖。安装Django项目所需的库。配置Django项目完成Django项目的开发和测试。配置项目的 settings.py 文件,例如设置数据库连接、静态文件路径等。安装和配置uWSGI......
  • Ajax和Axios
    1.1Ajax介绍1.1.1Ajax概述我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序,所以必须涉及到2个程序的交互,所以这就需要用到我们接下来学习的Ajax技术。Ajax:全......
  • Vue.js Ajax(axios)
     Vue.js2.0版本推荐使用axios来完成ajax请求。Axios是一个基于Promise的HTTP库,可以用在浏览器和node.js中。Github开源地址: https://github.com/axios/axios安装方法使用cdn:<scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>或<scri......
  • Vue.js Ajax(vue-resource)
     Vue要实现异步加载需要使用到vue-resource库。Vue.js2.0版本推荐使用 axios 来完成ajax请求。<scriptsrc="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"></script>Get请求以下是一个简单的Get请求实例,请求地址是一个简单的txt文......
  • Vue.js Ajax(axios)
    Vue.js2.0版本推荐使用axios来完成ajax请求。Axios是一个基于Promise的HTTP库,可以用在浏览器和node.js中。Github开源地址: https://github.com/axios/axios安装方法使用cdn:<scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>或<script......
  • Vue.js Ajax(vue-resource)
    Vue要实现异步加载需要使用到vue-resource库。Vue.js2.0版本推荐使用 axios 来完成ajax请求。<scriptsrc="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"></script>Get请求以下是一个简单的Get请求实例,请求地址是一个简单的txt文本:......
  • BS-Python-061 基于Python+Django实现在线考试系统
    作者主页:编程千纸鹤作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师主要内容:Java项目开发、Python项目开发、大学数据和AI项目开发、单片机项目设计、面试技术整理、最新技术分享收藏点赞不迷路 关注作者有好处文末获得源码 项目编号:BS-Python-061一,环境......
  • Django静态文件系统之meida文件,Django配置文件介绍,RBAC权限系统
    ⅠDjango静态文件系统之meida文件【一】问题引入一般常用的静态文件:static但是,媒体文件:图片,视频,音频……会随着用户改变而改变,不应该作为静态文件来使用应该是媒体资源于是Django提供了另一种静态文件语法meida文件【二】配置使用在Django的settings里面DEBUG—>开......