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

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


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


目录

[一 .项目搭建](#一 .项目搭建)

二.数据库设计

三.编写视图函数

四.模版渲染

五.效果展示

六.总结

七.更多干货


一 .项目搭建

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

bash 复制代码
django-admin startproject demo1
cd demo1

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

bash 复制代码
python manage.py startapp movies

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

python 复制代码
# 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 中定义电影和评论的模型

python 复制代码
# movies/models.py

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

class 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.title

class 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}"

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

bash 复制代码
python manage.py makemigrations
python manage.py migrate

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

三.编写视图函数

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

python 复制代码
# movies/views.py

from 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 Paginator

def 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

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"><< 第一页</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 }}">最后一页 >></a>
        {% endif %}
    </div>
</body>

</html>

电影详情模板 movie_detail.html

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.以上内容技术相关问题✉欢迎一起交流学习 ☟ ☟ ☟


相关推荐
20242817李臻5 分钟前
李臻20242817_安全文件传输系统项目报告_第9周
数据库·安全
一颗知足的心7 分钟前
Go语言之路————指针、结构体、方法
开发语言·后端·golang
小白考证进阶中8 分钟前
0基础可以考MySQL OCP么?备考时间需要多久?
数据库·mysql·开闭原则
观无14 分钟前
Redis远程链接应用案例
数据库·redis·缓存·c#
星星点点洲21 分钟前
【缓存与数据库结合方案】伪从技术 vs 直接同步/MQ方案的深度对比
数据库·缓存
努力奋斗的小杨25 分钟前
学习MySQL的第十二天
数据库·笔记·学习·mysql·navicat
hyhrosewind44 分钟前
Python函数基础:说明文档(多行注释),函数嵌套调用,变量作用域(局部,全局,global关键字),综合案例
python·变量作用域·函数说明文档(多行注释)·函数嵌套调用·局部变量和全局变量·函数内修改全局变量·global关键字
枫叶20001 小时前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase
仲夏plus1 小时前
MySQL:慢SQL索引优化-使用explain/analyze进行耗时分析的方法
数据库
一点.点1 小时前
李沐动手深度学习(pycharm中运行笔记)——04.数据预处理
pytorch·笔记·python·深度学习·pycharm·动手深度学习