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.pswp.cn/bicheng/78114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78114.shtml
英文地址,請注明出處:http://en.pswp.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…