热门标签 | 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


推荐阅读
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 本文介绍了在 Android 平台上的图片上传工具类优化方案,重点讨论了如何通过设置 `MultipartEntity` 来实现图片的高效上传。具体实现中,通过自定义 `UserUploadServiceImpl` 类,详细展示了如何构建和发送包含图片数据的 HTTP 请求。此外,还探讨了如何处理上传过程中的常见问题,如网络异常和文件格式验证,以确保上传的稳定性和可靠性。 ... [详细]
  • 本文介绍了如何在 PyCharm 中高效利用 Anaconda 管理项目环境配置。首先,确保已安装必要的软件。以 Windows 10 64位专业版为例,建议使用 PyCharm 2018.2 或更高版本。通过 Anaconda 创建和管理虚拟环境,可以显著提升开发效率,确保项目依赖的一致性和隔离性。文章详细阐述了从安装到配置的每一步操作,帮助开发者快速上手并充分利用这些工具的优势。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 本文介绍了如何利用Python的`os.path`模块来获取当前脚本文件的绝对路径,实现对文件位置的精准定位。通过示例代码展示了在复杂目录结构下(如 `C:\Users\songlihui\PycharmProjects\test001keshanchu\test\test1\test2\test3\test`)中准确获取文件路径的方法,帮助开发者在实际项目中更高效地管理文件资源。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
  • 在Unity3D的第13天学习中,我们深入探讨了关节系统和布料模拟技术。关节系统作为Unity中的关键物理组件,能够实现游戏对象间的动态连接,如刚体间的关系、门的开合动作以及角色的布娃娃效果。铰链关节涉及两个刚体的交互,能够精确模拟复杂的机械运动,为游戏增添了真实感。此外,布料模拟技术则进一步提升了角色衣物和环境装饰物的自然表现,增强了视觉效果的真实性和沉浸感。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • MySQL日志分析在应急响应中的应用与优化策略
    在应急响应中,MySQL日志分析对于检测和应对数据库攻击具有重要意义。常见的攻击手段包括弱口令、SQL注入、权限提升和备份数据窃取。通过对MySQL日志的深入分析,不仅可以及时发现潜在的攻击行为,还能详细还原攻击过程并追踪攻击源头。此外,优化日志记录和分析策略,能够提高安全响应效率,增强系统的整体安全性。 ... [详细]
  • Python 并发编程进阶:从初学者到高手的进程与模块开发指南
    Python 并发编程进阶:从初学者到高手的进程与模块开发指南 ... [详细]
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社区 版权所有