30-Django项目实战(8)

1 用户中心

当用户成功登录后,浏览器将重定向访问用户中心,改页面分为用户基本信息和歌曲播放记录,说明如下:

(1)用户基本信息;显示当前用户的用户头像和用户名,并设有用户注销链接。

(2)歌曲播放记录;播放记录来自于歌曲播放页的播放列表,并对播放记录进行分页显示。

1.1 路由

我们在项目应用user中实现用户中心,首先在user的urls.py中分别定义路由home和logout,代码如下:

from django.urls import path
from .views import *
urlpatterns = [
    # 用户注册和登录
    path('login.html', loginView, name='login'),
    # 用户中心
    path('home/<int:page>.html', homeView, name='home'),
    # 用户退出登录
    path('logout.html', logoutView, name='logout'),
]

路由home设置路由变量page,该变量是歌曲播放记录经过分页处理后的某一页页数,视图函数homeView负责接收和处理路由home的HTTP请求。路由logout实现用户退出功能,该路由的请求处理和响应过程由视图函数logoutView完成。

1.2 视图

在user的view.py中分别定义视图函数homeView和logoutView,代码如下:

from django.contrib.auth import login, logout
from index.models import *
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger


# 用户中心
# 设置用户登录限制
@login_required(login_url='/user/login.html')
def homeView(request, page):
    # 热搜歌曲
    searchs = Dynamic.objects.select_related('song').order_by('-search').all()[:4]
    # 分页功能
    songs = request.session.get('play_list', [])
    paginator = Paginator(songs, 3)
    try:
        pages = paginator.page(page)
    except PageNotAnInteger:
        pages = paginator.page(1)
    except EmptyPage:
        pages = paginator.page(paginator.num_pages)
    return render(request, 'home.html', locals())


# 退出登录
def logoutView(request):
    logout(request)
    return redirect('/')

视图函数logoutView调用内置方法logout实现用户退出功能,并重定向访问网站首页。视图函数homeView使用装饰器login_required限制用户访问权限,只有当前用户成功登录后才能访问用户中心。

从视图函数homeView的执行过程中看到,它实现了热搜歌曲的数据查询和歌曲播放记录的分页处理,但用户中心需要展示用户基本信息。

在settings.py的配置属性TEMPLATES中定义了处理器context_processors,在解析模板文件之前,Django依次运行处理器几个的程序。当运行到处理器auth时,程序会生成变量user和perms,并且将变量传入模板上下文TemplateContext中,因此用户中心的用户基本信息可以使用模板上下文user实现数据展示,无须在视图函数homeView中重复定义。

1.3 模板

最后打开模板文件home.html,在模板文件里编写用户中心的网页内容,代码如下:

{% extends "base.html"  %}
{% load static %}
{% block link %}
<link rel="shortcut icon" href="{% static "favicon.ico" %}">
<link rel="stylesheet" href="{% static "css/common.css" %}">
<link rel="stylesheet" href="{% static "css/user.css" %}">
{% endblock %}

{% block body  %}
<body class="member">
<div class="header">
<a href="/" class="logo"><img src="{% static "image/logo.png" %}"></a>
<div class="search-box">
    <form id="searchForm" action="{% url 'search' 1 %}" method="post">
    {% csrf_token %}
        <div class="search-keyword">
        <input id="kword" name="kword" type="text" class="keyword" maxlength="120">
        </div>
        <input id="subSerch" type="submit" class="search-button" value="搜 索">
    </form>
    <div id="suggest" class="search-suggest"></div>
    <div class="search-hot-words">
        {% for s in searchs %}
            <a target="play" href="{% url 'play' s.song.id %}">{{ s.song.name }}</a>
        {% endfor %}
    </div>
</div>
</div><!--end header-->

<div class="nav-box">
<div class="nav-box-inner">
    <ul class="nav clearfix">
        <li><a href="{% url 'index' %}">首页</a></li>
        <li><a href="{% url 'ranking' %}" target="_blank">歌曲排行</a></li>
        <li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li>
    </ul>
</div>
</div><!--end nav-box-->

<div class="mod_profile js_user_data" style="">
<div class="section_inner">
    <div class="profile__cover_link">
        <img src="{% static "image/user.jpg" %}" class="profile__cover">
    </div>
    <h1 class="profile__tit">
        <span class="profile__name">{{ user.username }}</span>
    </h1>
        <a href="{% url 'logout' %}" style="color:white;">退出登录</a>
</div>
</div>

<div class="main main--profile" style="">
<div class="mod_tab profile_nav" role="nav" id="nav">
    <span class="mod_tab__item mod_tab__current" id="hear_tab">我听过的歌</span>
</div>
<div class="js_box" style="display: block;">
<div class="profile_cont">
<div class="js_sub" style="display: block;">
<div class="mod_songlist">
    <ul class="songlist__header">
        <li class="songlist__header_name">歌曲</li>
        <li class="songlist__header_author">歌手</li>
        <li class="songlist__header_time">时长</li>
    </ul>
    <ul class="songlist__list">
        {% for item in pages.object_list %}
        <li>
            <div class="songlist__item songlist__item--even">
            <div class="songlist__songname">
                <a href="{% url 'play' item.id %}" class="js_song songlist__songname_txt" >{{ item.name }}</a>
            </div>
            <div class="songlist__artist">
                <a href="javascript:;" class="singer_name">{{ item.singer }}</a>
            </div>
            <div class="songlist__time">{{ item.time }}</div>
            </div>
        </li>
        {% endfor %}
    </ul>
</div><!--end mod_songlist-->

<!--分页-->
<div class="page-box">
    <div class="pagebar" id="pageBar">

        {% if pages.has_previous %}
        <a href="{% url 'home' pages.previous_page_number %}" class="prev" target="_self"><i></i>上一页</a>
        {% endif %}

        {% for page in pages.paginator.page_range %}
            {% if pages.number == page %}
                <span class="sel">{{ page }}</span>
            {% else %}
                <a href="{% url 'home' page %}" target="_self">{{ page }}</a>
            {% endif %}
        {% endfor %}

        {% if pages.has_next %}
        <a href="{% url 'home' pages.next_page_number %}" class="next" target="_self">下一页<i></i></a>
        {% endif %}
    </div>
</div>
</div>
</div>
</div>
</div>
</body>
{% endblock  %}

模板文件home.html实现了CSS样式文件引入、网站LOGO、歌曲搜索框、热搜歌曲、网站导航栏功能、用户基本信息和歌曲播放记录。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python-Django-Vue项目实战是一种常见的全栈发模式,结合了PythonDjango框架和Vue.js前端框架。下面是一个简单的介绍: Python-Django是一个强大的Web开发框架,它使用Python语言编写,提供了一系列的工具和库来简化Web应用程序的开发过程。Django具有高度的可扩展性和灵活性,可以帮助开发者快速构建功能丰富的Web应用。 Vue.js是一个流行的JavaScript前端框架,它专注于构建用户界面。Vue.js具有简单易学的语法和强大的功能,可以帮助开发者构建交互性强、响应迅速的前端应用。 在Python-Django-Vue项目实战中,通常会将Django作为后端框架来处理数据逻辑和业务逻辑,而Vue.js则负责前端页面的展示和用户交互。通过这种方式,可以实现前后端分离,提高开发效率和代码可维护性。 具体的项目实战可以包括以下内容: 1. 构建Django后端:使用Django框架创建后端应用程序,包括定义数据模型、编写视图函数、配置URL路由等。 2. 开发Vue前端:使用Vue.js框架创建前端应用程序,包括设计页面布局、编写组件、处理用户交互等。 3. 数据交互:通过RESTful API或GraphQL等方式,实现前后端数据的交互和通信。 4. 用户认证和权限管理:实现用户注册、登录、权限验证等功能,确保系统的安全性。 5. 数据库操作:使用Django的ORM(对象关系映射)来进行数据库操作,包括增删改查等。 6. 页面美化和响应式设计:使用CSS和Vue.js的样式绑定功能,实现页面的美化和响应式设计。 7. 部署和发布:将项目部署到服务器上,并进行性能优化和安全加固。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莎萌玩家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值