实践六:在数据模型中添加图片字段

news/2025/4/2 4:45:50/文章来源:https://www.cnblogs.com/chrisxyz/p/18801063

实践六:在数据模型中添加图片字段

内容简介:在本节内容中,我们将增加一个team应用,team的数据模型中包括ImageField字段,用于存储用户上传的照片。ImageField不同于CharField,需要重新设置settings.py文件。最终效果如下:

 

 

1. 在实践5的基础上,新增一个team应用

python manage.py startapp team 

2.将team应用添加到settings.py文件中

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','home', 'about','posts','team',#新增内容
]

3. 修改team应用中的settings.py文件,在STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]后添加新的代码如下:

STATIC_URL = 'static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') #新加内容
MEDIA_URL = '/media/' #新加内容

代码解释:在 Django 中,MEDIA_ROOT 和 MEDIA_URL 是用于处理上传的媒体文件(如图片、音频和视频)的重要设置。MEDIA_ROOT 用于指定媒体文件的存储路径,而 MEDIA_URL 则用于指定媒体文件在浏览器中访问的 URL。

4.修改my_project/urls.py文件

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include urlpatterns = [path('admin/', admin.site.urls),path('', include('home.urls')) ,path('about/', include('about.urls')) ,path('posts/', include('posts.urls')),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #新加内容

代码解释:接下来,我们需要在项目的 urls.py 文件中添加相应的 URL 配置,以便 Django 可以正确处理媒体文件的访问请求。此处,我们使用了 static() 函数来配置媒体文件的 URL 和文档根路径。settings.MEDIA_URL 指定了媒体文件的 URL,settings.MEDIA_ROOT 指定了媒体文件的文档根路径

5.更新team/models.py文件,代码如下:

from django.db import models# Create your models here.
class Student(models.Model):name=models.CharField(max_length=100)major=models.CharField(max_length=50)age=models.IntegerField()location=models.CharField(max_length=300)quote=models.CharField(max_length=300)description=models.TextField()profile=models.ImageField(upload_to='photo/')def __str__(self):return self.name

代码解释:在该数据模型中,我们增加了一个ImageField用于存储照片。

6.迁移数据模型

python manage.py makemigrations team 
python manage.py migrate team

7.打开team/views.py文件,创建一个StudentListView类

from django.views.generic import ListView
from .models import Studentclass StudentListView(ListView):model=Studenttemplate_name='students.html'context_object_name='students'

8.在templates中新建一个students.html文件,并添加如下代码

{% extends 'base.html' %}
{% block content %}
<h1 class="text-center">团队成员</h1>
<table class="table"><tr><th>姓名</th><th>专业</th><th></th></tr>{% for s in students %}<tr><td>{{s.name}}</td><td>{{s.major}}</td><td><a href="#" class="btn btn-primary">详情</a></td></tr>{% endfor %}
</table>{% endblock content %}

9.更改my_project项目和team中的urls.py文件

(1)在my_project/urls.py文件中添加如下代码:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include urlpatterns = [path('admin/', admin.site.urls),path('', include('home.urls')) ,path('about/', include('about.urls')) ,path('posts/', include('posts.urls')),path('team/',include('team.urls')), #新加内容
]

(2)在team中创建urls.py文件,并添加如下代码:

from django.urls import path
from . import viewsurlpatterns=[path('',views.StudentListView.as_view(),name='students'),
]

10.修改templates/base.html文件,在导航条中增加一个“团队成员”链接

<nav class="navbar navbar-expand-sm bg-light">   <div class="container-fluid"><ul class="navbar-nav"><li class="nav-item"><a class="nav-link" href="{% url 'home' %}">主页</a></li><li class="nav-item"><a class="nav-link" href="{% url 'posts' %}">信息公告</a></li><!-- 新加内容 --><li class="nav-item"><a class="nav-link" href="{% url 'students' %}">团队成员</a> </li><li class="nav-item"><a class="nav-link" href="{% url 'about' %}">关于我们</a></li></ul></div></nav>

11.启动本地服务器,查看效果

python manage.py runserver

12.添加详情页,更新team/views.py文件

from django.views.generic import ListView,DetailView #新增DetailView类
from .models import Studentclass StudentListView(ListView):model=Studenttemplate_name='students.html'context_object_name='students'class StudentDetailView(DetailView): #新增内容model=Studenttemplate_name='student_detail.html'context_object_name='student'

13.在templates中增加student_detail.html文件,代码如下

{% extends 'base.html' %}
{% block content %}
<h1 class="text-center">{{student.name}}</h1>
<p class="text-center">{{student.quote}}</p>   
<hr>
<div class="row"><div class="col-4"><p class="fw-bolder">About Me</p><p>{{student.description}}</p></div><div class="col-4"><img src="{{student.profile.url}}" class="rounded-circle mx-auto d-block" alt="个人照片" width="250" height="250"></div><div class="col-4"><p class="fw-bolder">Name:</p><p>{{student.name}}</p><p class="fw-bolder">Age:</p><p>{{student.age}}</p><p class="fw-bolder">Location:</p><p>{{student.location}}</p></div>
</div> 
{% endblock content %}

14.更新team/urls.py文件

from django.urls import path
from . import viewsurlpatterns=[path('',views.StudentListView.as_view(),name='students'),path('<int:pk>/',views.StudentDetailView.as_view(),name='student_detail'), #新增内容
]

15.更新templates/students.html,更新详情的链接

{% extends 'base.html' %}
{% block content %}
<h1 class="text-center">团队成员</h1>
<table class="table"><tr><th>姓名</th><th>专业</th><th></th></tr>{% for s in students %}<tr><td>{{s.name}}</td><td>{{s.major}}</td><!-- 更新链接 --><td><a href="{% url 'student_detail' s.pk %}" class="btn btn-primary">详情</a></td></tr>{% endfor %}
</table>{% endblock content %}

16.启动本地服务器,效果如下:

python manage.py runserver   

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908519.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】字符串(String)应用案例精选

Python “字符串” 经典范例 :20 个使用方法与技巧 以下是 Python 中字符串的 20 个经典使用实例,涵盖了常见的字符串操作和应用场景:1. 字符串反转 将字符串反转是经典的面试题之一,可以使用切片轻松实现。 s = "hello" reversed_s = s[::-1] print(reversed_s)…

vscode同时编辑多行添加自定义递增数字

vscode有时会遇到需要添加大量递增的数字的工作,这样的劳动相对重复又机械,使用以下办法来解决这样重复机械的劳动 如果对于批量操作需要高度自定义话,可直接看最后一种方法 1.多行光标,批量操作 MAC:option+shift+鼠标点击进行选择可以实现多行批量操作,批量删除 2.可自…

从菜鸟到高手:Linux C/C++程序性能分析实战指南!

"你这程序怎么这么卡啊?能不能优化一下?" —— 你的leader,大概率大家好,我是小康。 你有没有这样的经历:辛辛苦苦写完的 C++ 程序,功能测试一切正常,但一到生产环境就被吐槽"太慢了"?作为开发者,我们经常被要求解决性能问题,但如何找出程序的性…

US104N-ASEMI家用电器专用US104N

US104N-ASEMI家用电器专用US104N编辑:LL US104N-ASEMI家用电器专用US104N 型号:US104N 品牌:ASEMI 封装:TO-220F 栅极触发电压(Vgt):1.3V。 栅极触发电流(Igt):0.2mA。 保持电流最大值(Ih):30mA。 正向重复电压(Vdrm):800V。 通态电流最大值(It(RMS)):4A。 …

【Nmap】扫描结果美化后的服务器端口安全管理

所有的服务器使用Nmap扫描一下服务器列表的txt就可以,Nmap扫描结果通常是个XML文件,不方便浏览,推荐几个脚本,做一个扫描结果优化 https://github.com/ssjt21/parser_nmap_xml_2_Excel https://github.com/sp4rkw/NmapToExcel https://github.com/chuanwei/nmaptocsvNMAP扫…

plink软件中计算距离矩阵

001、--distance选项,计算具有不同位点的数目plink --file test --distance --out result ## 结果文件为每一个个体具有不同的SNP的数目,下三角矩阵形式展示,省略了第一行和最后一列 。002、

STM32 + keil5 HelloWrold

硬件清单 1. STM32F407VET6 2. STLINK V2下载器(带线)环境配置 1. 安装ST-LINK2. 安装并配置 keil5 https://blog.csdn.net/qq_36535414/article/details/108947292 https://blog.csdn.net/weixin_43732386/article/details/1173752663. 接线并下载烧入完成后拔插ST-LINK V2,就…

MySQL 锁机制:数据库的交通管制系统

MySQL 锁机制:数据库的"交通管制系统" 🚦 在数据的高速公路上,没有红绿灯会怎样?一片混乱!MySQL 的锁机制就是数据库世界的交通规则... 什么是锁机制?🤔 锁机制是数据库用来控制并发访问的一种方式,确保在多人同时操作数据库时不会出现数据不一致或损坏。简…

揭秘AI自动化框架Browser-use(四):Browser-use记忆模块技术解析

在 AI 自动化任务中,记忆模块是实现复杂任务处理的关键组件。Browser-use 项目通过引入记忆模块,解决了 LLM 在连续性任务中的无状态性问题,使代理能够维持上下文连贯性,执行复杂多步骤任务,并从错误中学习和恢复。一、从一次失败的景点采集说起 在 AI 自动化任务中,记忆…

微软Dynamics 365Power Platform技术找工作|宝藏岗位+金饭碗+高薪潜力

【简单介绍】‌ (长沙爱码士IT培训是一家专门培训微软Dynamics 365 CRM和Power Platform技术的一家公司www.aimashi365.com)本人是长沙爱码士IT的金牌讲师,已经帮助上百位学员找到IT工作,对训微软Dynamics 365 CRM和Power Platform技术有兴趣的朋友,我们可以随时沟通交流。…

差分约束学习笔记

一.差分约束系统 如果一个系统有 \(n\) 个变量 \(x_1,x_2,,x_n\) 和 \(m\) 个约束条件(也是不等式)和\(m\) 个常量 \(w_1,w_2,,w_m\)。每一个不等式形如以下格式 \(x_i - x_j \le w_k\)(\(1 \le i,j \le n\),\(1 \le k \le m\))。则称之为差分约束系统。 这个名字的由来是…

9.6K+ Star!一个基于 SpringBoot + Vue3 的工作流引擎快速开发平台!

mldong —— 一个基于 SpringBoot + Vue3 实现的工作流引擎快速开发平台,采用前后端分离的模式,内置完整的权限架构。大家好,我是 Java陈序员。 今天,给大家介绍一个基于 SpringBoot + Vue3 的工作流引擎快速开发平台!关注微信公众号:【Java陈序员】,获取开源项目分享、…