Django 实现电影推荐系统:从搭建到功能完善(附源码)

前言:本文将详细介绍如何使用 Django 构建一个电影推荐系统,涵盖项目的搭建、数据库设计、视图函数编写、模板渲染以及用户认证等多个方面。🔗软件安装、环境准备


 【作者主页—📚优质文章、获取更多优质源码】


目录

一 .项目搭建

二.数据库设计 

三.编写视图函数

四.模版渲染 

五.效果展示

六.总结

七.更多干货


一 .项目搭建

首先,我们需要创建一个新的 Django 项目

django-admin startproject demo1
cd demo1

 然后,创建一个名为 movies(自定义) 的应用

python manage.py startapp movies

 在 demo1/settings.py 中进行相关配置,包括数据库、应用安装、模板路径

# demo1/settings.py# 应用安装
INSTALLED_APPS = ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.contrib.sessions","django.contrib.messages","django.contrib.staticfiles","movies",
]# 数据库配置
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'movie','USER': 'root','PASSWORD': '123456','HOST': '127.0.0.1','PORT': '3306'}
}# 模板路径配置
TEMPLATES = [{"BACKEND": "django.template.backends.django.DjangoTemplates","DIRS": [os.path.join(BASE_DIR, 'templates')],"APP_DIRS": True,"OPTIONS": {"context_processors": ["django.template.context_processors.debug","django.template.context_processors.request","django.contrib.auth.context_processors.auth","django.contrib.messages.context_processors.messages",],},},
]

二.数据库设计 

 在 movies/models.py 中定义电影和评论的模型

# movies/models.pyfrom django.db import models
from django.contrib.auth.models import Userclass Movie(models.Model):title = models.CharField(max_length=200)description = models.TextField()release_date = models.DateField()director = models.CharField(max_length=100)poster = models.ImageField(upload_to='文件夹名/', blank=True, null=True)average_rating = models.FloatField(default=0)def __str__(self):return self.titleclass Review(models.Model):movie = models.ForeignKey(Movie, on_delete=models.CASCADE, related_name='reviews')user = models.ForeignKey(User, on_delete=models.CASCADE)rating = models.IntegerField(choices=[(i, i) for i in range(1, 6)])comment = models.TextField()created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return f"Review for {self.movie.title} by {self.user.username}"

 创建数据库迁移文件并应用迁移

python manage.py makemigrations
python manage.py migrate

 下图即是正确的数据库表目录

三.编写视图函数

在 movies/views.py 中编写视图函数,实现电影列表、电影详情、添加评论、用户登录和退出功能

# movies/views.pyfrom django.shortcuts import render, redirect, get_object_or_404
from .models import Movie, Review
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from django.db.models import Avg
from django.core.paginator import Paginatordef movie_list(request):search_query = request.GET.get('search', '')if search_query:movies = Movie.objects.filter(title__icontains=search_query)else:movies = Movie.objects.all()page_number = request.GET.get('page')page_obj = paginator.get_page(page_number)return render(request, 'movie_list.html', {'page_obj': page_obj, 'search_query': search_query})def movie_detail(request, movie_id):movie = get_object_or_404(Movie, id=movie_id)reviews = movie.reviews.all()return render(request, 'movie_detail.html', {'movie': movie, 'reviews': reviews})@login_required
def add_review(request, movie_id):movie = get_object_or_404(Movie, id=movie_id)if request.method == 'POST':rating = request.POST.get('rating')comment = request.POST.get('comment')Review.objects.create(movie=movie, user=request.user, rating=rating, comment=comment)# 更新电影平均评分movie.average_rating = movie.reviews.aggregate(Avg('rating'))['rating__avg']movie.save()return redirect('movie_detail', movie_id=movie.id)return render(request, 'add_review.html', {'movie': movie})def user_login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')user = authenticate(request, username=username, password=password)if user is not None:login(request, user)return redirect('movie_list')else:messages.error(request, '用户名或密码错误')return render(request, 'login.html')@login_required
def user_logout(request):logout(request)return redirect('movie_list')

四.模版渲染 

 在 movies/templates 目录下创建相应的 HTML 模板文件,用于展示电影列表、电影详情、添加评论和用户登录页面。

电影列表模板 movie_list.html 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>电影推荐系统</title>
----------------- css样式代码省略 -----------------
</head><body><nav><h1>电影推荐系统</h1><form action="" method="get"><input type="text" name="search" placeholder="搜索电影"><input type="submit" value="搜索"></form>{% if user.is_authenticated %}<a href="{% url 'user_logout' %}">退出登录</a>{% else %}<a href="{% url 'user_login' %}">登录</a>{% endif %}</nav><div class="movie-container">{% for movie in page_obj %}<div class="movie-card">{% if movie.poster %}<img src="{{ movie.poster.url }}" alt="{{ movie.title }}">{% else %}<img src="https://dummyimage.com/200x300/000/fff&text=No+Poster" alt="{{ movie.title }}">{% endif %}<div class="movie-info"><h2>{{ movie.title }}</h2><p>评分: {{ movie.average_rating }}</p><a href="{% url 'movie_detail' movie.id %}">查看详情</a></div></div>{% endfor %}</div><div class="pagination">{% if page_obj.has_previous %}<a href="?page=1">&laquo; 第一页</a><a href="?page={{ page_obj.previous_page_number }}">上一页</a>{% endif %}<span class="current">第 {{ page_obj.number }} 页,共 {{ page_obj.paginator.num_pages }} 页。</span>{% if page_obj.has_next %}<a href="?page={{ page_obj.next_page_number }}">下一页</a><a href="?page={{ page_obj.paginator.num_pages }}">最后一页 &raquo;</a>{% endif %}</div>
</body></html>

 电影详情模板 movie_detail.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>{{ movie.title }} 详情</title>
-------------------- css样式代码省略 --------------------
</head><body><h1>{{ movie.title }}</h1><div class="movie-detail">{% if movie.poster %}<div class="movie-poster"><img src="{{ movie.poster.url }}" alt="{{ movie.title }}"></div>{% else %}<div class="movie-poster"><img src="https://dummyimage.com/300x450/000/fff&text=No+Poster" alt="{{ movie.title }}"></div>{% endif %}<div class="movie-info"><p>导演: {{ movie.director }}</p><p>上映日期: {{ movie.release_date }}</p><p>描述: {{ movie.description }}</p><p>评分: {{ movie.average_rating }}</p>{% if user.is_authenticated %}<a href="{% url 'add_review' movie.id %}">添加评论</a>{% endif %}</div></div><h2>用户评论</h2>{% for review in reviews %}<div class="review"><p>用户: {{ review.user.username }}</p><p>评分: {{ review.rating }}</p><p>评论: {{ review.comment }}</p><p>时间: {{ review.created_at|date:"Y-m-d"  }}</p></div>{% endfor %}
</body></html>

五.效果展示

六.总结

希望本文对你有所帮助,如果你有任何疑问或建议,欢迎在评论区留言。

以上文章详细介绍了如何使用 Django 构建电影推荐系统,从项目搭建到功能实现,每个步骤都有相应的代码示例。你可以根据自己的需求进行修改和扩展。

七.更多干货

--------------------- - -----✈---------   ---------✈--------------------✈-------
1.如果我的博客对你有帮助或你喜欢我的博客内容,请 “👍点赞” “✍️评论” “★收藏” 一键三连哦!

2.❤️【👇🏻👇🏻👇🏻关注我| 获取更多源码 | 优质文章】 带您学习各种前端插件、3D炫酷效果、图片展示、文字效果、以及整站模板 、HTML模板 、微信小程序模板 、等! 「在这里一起探讨知识,互相学习」!

3.以上内容技术相关问题✉欢迎一起交流学习 ☟   ☟   ☟
————————————————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#进阶学习(七)常见的泛型数据结构类(2)HashSet和SortedSet

目录 using System.Collections.Generic; // 核心命名空间 一、 HashSet 核心特性 常用方法 属性 二、SortedSet 核心特性 1、整型&#xff08;int、long 等&#xff09; 2、字符串型&#xff08;string&#xff09; 3、字符型&#xff08;char&#xff09; 4、自定义…

SQL之DML(查询语句:select、where)

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 select查询语句 在开发中&#xff0c;查询语句是使用最多&#xff0c;也是CRUD中&#xff0c;复杂度最高的sql语句。 查询的语法结构 select *|字段1 [, 字段2 ……] from 表…

vue | 不同 vue 版本对复杂泛型的支持情况 · vue3.2 VS vue3.5

省流总结&#xff1a;defineProps 的泛型能力&#xff0c;来直接推导第三方组件的 props 类型 引入第三方库的类型&#xff0c;并直接在 <script setup> 中作为 props 使用。这种类型一般是复杂泛型&#xff08;包含联合类型、可选属性、交叉类型、条件类型等&#xff0…

Unity-无限滚动列表实现Timer时间管理实现

今天我们来做一个UI里经常做的东西&#xff1a;无限滚动列表。 首先我们得写清楚实现的基本思路&#xff1a; 所谓的无限滚动当然不是真的无限滚动&#xff0c;我们只要把离开列表的框再丢到列表的后面就行&#xff0c;核心理念和对象池是类似的。 我们来一点一点实现&#x…

Docker的基本概念和一些运用场景

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员更加高效地打包、发布和运行应用程序。以下是 Docker 的基本概念和优势&#xff1a; 基本概念&#xff1a; 容器&#xff1a;Docker 使用容器来打包应用程序及其依赖项&#xff0c;容器是一个独立且可移植的运行环境…

Unity中基于第三方插件扩展的对于文件流处理的工具脚本

在Unity的项目中对应文件处理,在很多地方用到,常见的功能,就是保存文件,加载文件,判断文件或者文件夹是否存在,删除文件等。 在之前已经写过通过C#的IO实现的这些功能,可查看《Unity C# 使用IO流对文件的常用操作》,但是不能保证所有平台都可以使用 现在基于第三方跨…

Flink介绍——实时计算核心论文之MillWheel论文详解

引入 通过前面的文章&#xff0c;我们从S4到Storm&#xff0c;再到Storm结合Kafka成为当时的实时处理最佳实践&#xff1a; S4论文详解S4论文总结Storm论文详解Storm论文总结Kafka论文详解Kafka论文总结 然而KafkaStorm的第一代流式数据处理组合&#xff0c;还面临的三个核心…

python异步协程async调用过程图解

1.背景&#xff1a; 项目中有用到协程&#xff0c;但是对于协程&#xff0c;线程&#xff0c;进程的区别还不是特别了解&#xff0c;所以用图示的方式画了出来&#xff0c;用于理清三者的概念。 2.概念理解&#xff1a; 2.1协程&#xff0c;线程&#xff0c;进程包含关系 一…

【React】获取元素距离页面顶部的距离

文章目录 代码实现 代码实现 import { useEffect, useRef, useState } from react;const DynamicPositionTracker () > {const [distance, setDistance] useState(0);const divRef useRef(null);useEffect(() > {const targetDiv divRef.current;if (!targetDiv) re…

26.OpenCV形态学操作

OpenCV形态学操作 形态学操作&#xff08;Morphological Operations&#xff09;源自二值图像处理&#xff0c;主要用于分析和处理图像中的结构元素&#xff0c;对图像进行去噪、提取边缘、分割等预处理步骤。OpenCV库中提供了丰富的形态学函数&#xff0c;常见的包括&#xf…

逻辑回归:损失和正则化技术的深入研究

逻辑回归&#xff1a;损失和正则化技术的深入研究 引言 逻辑回归是一种广泛应用于分类问题的统计模型&#xff0c;尤其在机器学习领域中占据着重要的地位。尽管其名称中包含"回归"&#xff0c;但逻辑回归本质上是一种分类算法。它的核心思想是在线性回归的基础上添…

大模型面经 | 介绍一下CLIP和BLIP

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…

【MCP】第二篇:IDE革命——用MCP构建下一代智能工具链

【MCP】第二篇&#xff1a;IDE革命——用MCP构建下一代智能工具链 一、引言二、IDE集成MCP2.1 VSCode2.1.1 安装VSCode2.1.2 安装Cline2.1.3 配置Cline2.1.4 环境准备2.1.5 安装MCP服务器2.1.5.1 自动安装2.1.5.2 手动安装 2.2 Trae CN2.2.1 安装Trae CN2.2.2 Cline使用2.2.3 内…

【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】

DP读书&#xff1a;新能源科学与工程——专业课「新能源发电系统」 2025a 版本 MATLAB下面进入正题 仿真一&#xff1a;Buck 电路一、仿真目的二、仿真内容&#xff08;一&#xff09;Buck电路基本构成及工作原理&#xff08;二&#xff09;Buck电路仿真模型及元件连接&#xf…

BootStrap:首页排版(其一)

今天我要介绍的是在BootStrap中有关于首页排版的内容知识点&#xff0c;即&#xff08;模态框&#xff0c;选项卡&#xff09;。 模态框&#xff1a; 模态框经过了优化&#xff0c;更加灵活&#xff0c;以弹出对话框的形式出现&#xff0c;具有最小和最实用的功能集。 在运行…

Spring Data

目录 一、Spring Data 简介与生态概览 什么是 Spring Data&#xff1f; Spring Data 与 Spring Data JPA 的关系 Spring Data 家族&#xff1a;JPA、MongoDB、Redis、Elasticsearch、JDBC、R2DBC…… 与 MyBatis 的本质差异&#xff08;ORM vs SQL 显式控制&#xff09; 二…

建筑末端配电回路用电安全解决方案

一、电气火灾的严峻现状 根据国家应急管理部消防救援局的数据&#xff0c;电气火灾长期占据各类火灾原因之首&#xff0c;2021年占比高达50.4%。其中&#xff0c;末端配电回路因保护不足、监测手段落后&#xff0c;成为火灾高发隐患点。私拉电线、线路老化、接触不良、过载等问…

华为开发岗暑期实习笔试(2025年4月16日)

刷题小记&#xff1a; 第一题怀疑测试样例不完整&#xff0c;贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题&#xff0c;往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题&#xff0c;难点在于满足3重判断规则&#xff0c;所需…

Rust: 从内存地址信息看内存布局

内存布局其实有几个&#xff1a;address&#xff08;地址&#xff09;、size&#xff08;大小&#xff09;、alignment&#xff08;对齐位数&#xff0c;2 的自然数次幂&#xff0c;2&#xff0c;4&#xff0c;8…&#xff09;。 今天主要从address来看内存的布局。 说明&…

每日一题算法——两个数组的交集

两个数组的交集 力扣题目链接 我的解法&#xff1a;利用数组下标。 缺点&#xff1a;当取值范围很大时&#xff0c;浪费空间。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int count1[1001]{0…