热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Luffy之Xadmin以及首页搭建(轮播图,导航)

1.首页1.1轮播图admin站点配置支持图片上传pipinstallPillow默认情况下,Django会将上传的图片保存在本地服务器上,需要配置保存

1. 首页

1.1 轮播图

admin站点配置支持图片上传

pip install Pillow

  默认情况下,Django会将上传的图片保存在本地服务器上,需要配置保存的路径。我们可以将上传的文件保存在静态文件statics目录中,添加如下上传保存目录信息

配置代码:

# 访问静态文件的url地址前缀
STATIC_URL = '/static/'

# 项目中存储上传文件的根目录[暂时配置],注意,static目录需要手动创建否则上传文件时报错
MEDIA_ROOT=os.path.join(BASE_DIR,"luffy/static")
# 设置django的静态文件目录
STATICFILES_DIRS = [os.path.join(BASE_DIR,"luffy/static")
]

 

把Home子应用注册到settings的INSTALLED_APPS中,并在models.py里面创建模型。

INSTALLED_APPS = [...'luffy.apps.home',
]

使用图片字段ImageFiled,字段选项使用upload_to可以设置保存图片的子目录,数据模型代码:

class BannerInfo(models.Model):"""轮播图"""# upload_to 存储子目录,真实存放地址会使用配置中的MADIE_ROOT+upload_toimage = models.ImageField(upload_to='banner', verbose_name='轮播图', null=True)name = models.CharField(max_length=150, verbose_name='轮播图名称')link = models.CharField(max_length=150, verbose_name='轮播图广告地址')orders = models.IntegerField(verbose_name='显示顺序')is_show=models.BooleanField(verbose_name="是否上架",default=False)is_delete=models.BooleanField(verbose_name="逻辑删除",default=False)class Meta:db_table = 'ly_banner'verbose_name = '轮播图'verbose_name_plural = verbose_namedef __str__(self):return self.name

模型数据迁移:

python manage.py makemigrations
python manage.py migrate

在xadmin站点添加轮播图数据

通过如下命令安装xadmin的最新版

在配置文件中注册如下应用

INSTALLED_APPS = [...'rest_framework','xadmin','crispy_forms','reversion',...
]# 修改使用中文界面
LANGUAGE_CODE = 'zh-Hans'# 修改时区
TIME_ZONE = 'Asia/Shanghai'

  xadmin有建立自己的数据库模型类,需要进行数据库迁移

python manage.py makemigrations
python manage.py migrate

  

在总路由中添加xadmin的路由信息

import xadmin
xadmin.autodiscover()
# version模块自动注册需要版本控制的 Model
from xadmin.plugins import xversion
xversion.register_models()urlpatterns
= [path(r'xadmin/', xadmin.site.urls)
]

创建超级用户

python manage.py createsuperuser

  

创建轮播图的模型管理类

import xadmin
from xadmin import viewsclass BaseSetting(object):"""xadmin的基本配置"""enable_themes = True # 开启主题切换功能use_bootswatch = Truexadmin.site.register(views.BaseAdminView, BaseSetting)class GlobalSettings(object):"""xadmin的全局配置"""site_title = "路飞学城" # 设置站点标题site_footer = "路飞学城有限公司" # 设置站点的页脚menu_style = "accordion" # 设置菜单折叠

xadmin.site.register(views.CommAdminView, GlobalSettings)
# 轮播图
from home.models import bannerInfo
class BannerInfoModelAdmin(object):list_display=["name","orders","is_show"]
xadmin.site.register(bannerInfo, BannerInfoModelAdmin)

路由代码:

子应用路由:

from django.urls import path,re_path
from . import views
urlpatterns = [
path(r"banner/",views.BannerInfoAPIView.as_view()),
]

  

总路由:

urlpatterns = [...path('home/', include("home.urls")),# include 的值必须是 模块名.urls 格式,字符串中间只能出现一个圆点
]

 

视图代码: 

from django.db.models import Q
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import bannerInfo
class BannerInfoAPIView(APIView):"""轮播图列表"""def get(self,request):# 获取数据banners = bannerInfo.objects.filter(Q(is_show=True) & Q(is_delete=False)).order_by("-orders")# 调整banners的images字段# 序列化data = []for item in banners:data.append({# 拼接图片的url地址"image": "/static/" + item.image.url,"link":item.link,"orders":item.orders,})return Response(data)前端代码:
<template><div class&#61;"banner"><el-carousel trigger&#61;"click" height&#61;"506px"><el-carousel-item v-for&#61;"item in banner_list"><a :href&#61;"item.link"><img :src&#61;"item.image">a>el-carousel-item>el-carousel>div>
template><script>export default {name:"Banner",data(){return {banner_list:[],};},created: function(){// 获取轮播图this.$axios.get("http://api.luffycity.cn:8000/home/banner/").then(res &#61;> {this.banner_list &#61; res.data}).catch(error &#61;> {console.log(error);});}}
script><style scoped>
.banner img
{width: 100%;
}
style>

View Code

 

2. 显示登陆页面

前端引入登陆页面的组件代码并补充路由地址

Login.vue&#xff0c;代码&#xff1a;

<template><div class&#61;"login box"><img src&#61;"https://www.luffycity.com/static/img/Loginbg.3377d0c.jpg" alt&#61;""><div class&#61;"login"><div class&#61;"login-title"><img src&#61;"https://www.luffycity.com/static/img/Logotitle.1ba5466.png" alt&#61;""><p>帮助有志向的年轻人通过努力学习获得体面的工作和生活!p>div><div class&#61;"login_box"><div class&#61;"title"><span &#64;click&#61;"login_type&#61;1" :class&#61;"login_type&#61;&#61;1?&#39;current&#39;:&#39;&#39;">密码登录span><span &#64;click&#61;"login_type&#61;2" :class&#61;"login_type&#61;&#61;2?&#39;current&#39;:&#39;&#39;">短信登录span>div><div class&#61;"inp" :class&#61;"login_type&#61;&#61;1?&#39;show&#39;:&#39;&#39;"><input v-model &#61; &#39;username&#39; type&#61;"text" placeholder&#61;"用户名 / 手机号码" class&#61;"user"><input v-model &#61; &#39;password&#39; type&#61;"password" name&#61;"" class&#61;"pwd" placeholder&#61;"密码"><div id&#61;"geetest1" title&#61;"验证码">div><div class&#61;"rember"><p><input type&#61;"checkbox" class&#61;"no" name&#61;"a">input><span>记住密码span>p><p>忘记密码p>div><button class&#61;"login_btn">登录button><p class&#61;"go_login" >没有账号 <span>立即注册span>p>div><div class&#61;"inp" :class&#61;"login_type&#61;&#61;2?&#39;show&#39;:&#39;&#39;"><input v-model &#61; &#39;username&#39; type&#61;"text" placeholder&#61;"手机号码" class&#61;"user"><input v-model &#61; &#39;password&#39; type&#61;"password" name&#61;"" class&#61;"pwd" placeholder&#61;"短信验证码"><div class&#61;"rember"><p><input type&#61;"checkbox" class&#61;"no" name&#61;"a">input><span>记住密码span>p><p>忘记密码p>div><button class&#61;"login_btn">登录button><p class&#61;"go_login" >没有账号 <span>立即注册span>p>div>div>div>div>
template><script>export default{name:"Login",data(){return {login_type:2,username:"",password:"",}},components:{}}
script><style scoped>
.box
{width: 100%;position: relative;}
.box img
{width: 100%;
}
.box .login
{position: absolute;width: 500px;height: 400px;top: 50%;left: 50%;margin-left: -250px;margin-top: -300px;
}
.login .login-title
{width: 100%;text-align: center;
}
.login-title img
{width: 190px;height: auto;
}
.login-title p
{font-family: PingFangSC-Regular;font-size: 18px;color: #fff;letter-spacing: .29px;padding-top: 10px;padding-bottom: 50px;
}
.login_box
{width: 400px;height: auto;background: #fff;box-shadow: 0 2px 4px 0 rgba(0,0,0,.5);border-radius: 4px;margin: 0 auto;padding-bottom: 40px;
}
.login_box .title
{font-size: 20px;color: #9b9b9b;letter-spacing: .32px;border-bottom: 1px solid #e6e6e6;display: flex;justify-content: space-around;padding: 50px 60px 0 60px;margin-bottom: 20px;cursor: pointer;
}
.login_box .title .current
{color: #4a4a4a;border-bottom: 2px solid #84cc39;
}.inp{width: 350px;margin: 0 auto;display: none;
}
.show
{display: block;
}
.inp input
{border: 0;outline: 0;width: 100%;height: 45px;border-radius: 4px;border: 1px solid #d9d9d9;text-indent: 20px;font-size: 14px;background: #fff !important;
}
.inp input.user
{margin-bottom: 16px;
}
.inp .rember
{display: flex;justify-content: space-between;align-items: center;position: relative;margin-top: 10px;
}
.inp .rember p:first-of-type
{font-size: 12px;color: #4a4a4a;letter-spacing: .19px;margin-left: 22px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;/*position: relative;*/
}
.inp .rember p:nth-of-type(2)
{font-size: 14px;color: #9b9b9b;letter-spacing: .19px;cursor: pointer;
}.inp .rember input{outline: 0;width: 30px;height: 45px;border-radius: 4px;border: 1px solid #d9d9d9;text-indent: 20px;font-size: 14px;background: #fff !important;
}.inp .rember p span{display: inline-block;font-size: 12px;width: 100px;/*position: absolute;*/
/*left: 20px;*/}
#geetest
{margin-top: 20px;
}
.login_btn
{width: 100%;height: 45px;background: #84cc39;border-radius: 5px;font-size: 16px;color: #fff;letter-spacing: .26px;margin-top: 30px;
}
.inp .go_login
{text-align: center;font-size: 14px;color: #9b9b9b;letter-spacing: .26px;padding-top: 20px;
}
.inp .go_login span
{color: #84cc39;cursor: pointer;
}
style>

View Code

在routes/index.js中&#xff0c;添加路由

import Vue from "vue"
import Router from "vue-router"// 导入需要注册路由的组件
import Home from "../components/Home"
import Login from "../components/Login"
Vue.use(Router);// 配置路由列表
export default new Router({mode:"history",routes:[// 路由列表{name:"Home",path: "/home",component:Home,},{name:"Home",path: "/",component:Home,},{name:"Login",path: "/login",component:Login,}]
})

View Code

 

 

 

 

修复关于前端无法正常显示图片的问题

1.在settings中设置 MEDIA_URL:

# 项目中存储上传文件的根目录[暂时配置]&#xff0c;注意&#xff0c;static目录需要手动创建否则上传文件时报错
MEDIA_ROOT&#61;os.path.join(BASE_DIR,"luffy/static")# 设置访问上传文件的url地址前缀
MEDIA_URL &#61; "/media/"

  此时 MEDIA_URL &#61; "/media/" 中meida 代表着MEDIA_ROOT中代表的路径

2.在视图函数中提供完整的域名地址

from django.db.models import Q
from rest_framework.views import APIView
from rest_framework.response import Responsefrom luffy.apps.home.models import BannerInfoHOST &#61; "http://api.luffycity.cn:8000"
class BannerInfoAPIView(APIView):"""轮播图列表"""def get(self,request):# 获取数据banners &#61; BannerInfo.objects.filter(Q(is_show&#61;True) & Q(is_delete&#61;False)).order_by("-orders")# 调整banners的images字段# 序列化data &#61; []for item in banners:data.append({# 拼接图片的url地址"image": HOST &#43; item.image.url,"link":item.link,"orders":item.orders,})return Response(data)

View Code

3.在主urls 设置路由

from django.conf import settings
from django.views.static import serveurlpatterns &#61; [re_path(r&#39;^media/(?P.*)$&#39;, serve, {"document_root": settings.MEDIA_ROOT}),

  


转载于:https://www.cnblogs.com/Mixtea/p/10595814.html


推荐阅读
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • Python 异步编程:ASGI 服务器与框架详解
    自 Python 3.5 引入 async/await 语法以来,异步编程迅速崛起,吸引了大量开发者的关注。本文将深入探讨 ASGI(异步服务器网关接口)及其在现代 Python Web 开发中的应用,介绍主流的 ASGI 服务器和框架。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 深入理解 .NET 中的中间件
    中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ... [详细]
  • 网络出版服务许可证申请指南
    本文详细介绍了网络出版服务许可证的办理条件、适用企业范围及具体流程,帮助相关企业和个人了解并顺利完成许可证的申请。文章由专业机构提供,旨在为读者解答在互联网出版领域遇到的技术和合规问题。 ... [详细]
  • Python Django大学生心理健康管理系统开发(含源码、文档)
    本项目包含完整的源代码、设计文档、数据库结构以及详细的安装指南,旨在为计算机专业的学生提供一个全面的心理健康管理系统解决方案。 ... [详细]
author-avatar
采蘑菇的灵的fans
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有