整体步骤概览

  1. 创建项目和应用
  2. 设计模型(Model) - 定义设备的数据结构
  3. 配置用户认证(Auth) - 使用 Django 自带的强大用户系统
  4. 创建视图(View) - 处理业务逻辑:登录、列表、增删改查
  5. 编写模板(Template) - 设计前端页面
  6. 配置路由(URL) - 将 URL 映射到视图
  7. 运行测试

第一步:创建项目和应用

# 1. 在合适的位置创建项目目录并进入
mkdir my_device_manager
cd my_device_manager# 2. 创建虚拟环境(推荐)
python -m venv venv# 3. 激活虚拟环境
# On Windows:
venv\Scripts\activate
# On macOS/Linux:
source venv/bin/activate# 4. 安装 Django
pip install django# 5. 创建Django项目,名为 `my_site`
django-admin startproject my_site .# 6. 创建一个名为 `devices` 的应用来处理设备相关的功能
python manage.py startapp devices# 7. 将新应用 `devices` 和 Django 自带的 `auth` 应用添加到设置中
# 编辑 my_site/settings.py

编辑 my_site/settings.py:

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth', # 用户认证系统'django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','devices', # 添加你的应用
]

同时,在文件末尾配置数据库(默认使用 SQLite,无需修改即可用)和静态文件。


第二步:设计设备模型 (Model)

编辑 devices/models.py:

from django.db import models
from django.contrib.auth.models import Userclass Device(models.Model):# 设备类型选择TYPE_CHOICES = (('router', '路由器'),('switch', '交换机'),('server', '服务器'),('pc', '个人电脑'),('other', '其他'),)name = models.CharField(max_length=100, verbose_name="设备名称")ip_address = models.GenericIPAddressField(verbose_name="IP地址")type = models.CharField(max_length=20, choices=TYPE_CHOICES, default='other', verbose_name="设备类型")description = models.TextField(blank=True, null=True, verbose_name="设备描述")# 添加创建时间和更新时间created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")# 将设备与用户关联(一个用户拥有多个设备)owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='devices', verbose_name="所属用户")def __str__(self):return f"{self.name} ({self.ip_address})"class Meta:verbose_name = "设备"verbose_name_plural = "设备"

创建数据库表:

# 生成迁移文件
python manage.py makemigrations
# 执行迁移,在数据库中创建表
python manage.py migrate

第三步:创建处理逻辑的视图 (View)

编辑 devices/views.py:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .models import Device
from .forms import DeviceForm # 我们稍后会创建这个表单def user_login(request):"""用户登录视图"""if request.method == 'POST':username = request.POST['username']password = request.POST['password']user = authenticate(request, username=username, password=password)if user is not None:login(request, user)messages.success(request, f'欢迎回来,{username}!')return redirect('device_list')else:messages.error(request, '用户名或密码错误!')return render(request, 'registration/login.html')@login_required
def user_logout(request):"""用户登出视图"""logout(request)messages.info(request, '您已成功登出。')return redirect('user_login')@login_required
def device_list(request):"""设备列表视图,只显示当前用户的设备"""devices = Device.objects.filter(owner=request.user)return render(request, 'devices/device_list.html', {'devices': devices})@login_required
def device_create(request):"""创建设备视图"""if request.method == 'POST':form = DeviceForm(request.POST)if form.is_valid():new_device = form.save(commit=False)new_device.owner = request.user # 自动设置设备所有者為当前用户new_device.save()messages.success(request, f'设备 {new_device.name} 创建成功!')return redirect('device_list')else:form = DeviceForm()return render(request, 'devices/device_form.html', {'form': form, 'title': '添加新设备'})@login_required
def device_update(request, pk):"""更新设备视图"""device = get_object_or_404(Device, pk=pk, owner=request.user) # 确保用户只能修改自己的设备if request.method == 'POST':form = DeviceForm(request.POST, instance=device)if form.is_valid():form.save()messages.success(request, f'设备 {device.name} 更新成功!')return redirect('device_list')else:form = DeviceForm(instance=device)return render(request, 'devices/device_form.html', {'form': form, 'title': '编辑设备'})@login_required
def device_delete(request, pk):"""删除设备视图"""device = get_object_or_404(Device, pk=pk, owner=request.user)if request.method == 'POST':device_name = device.namedevice.delete()messages.success(request, f'设备 {device_name} 已删除。')return redirect('device_list')return render(request, 'devices/device_confirm_delete.html', {'device': device})

第四步:创建表单 (Form)

Django 的表单可以简化 HTML 表单的创建和验证。

创建 devices/forms.py:

from django import forms
from .models import Deviceclass DeviceForm(forms.ModelForm):class Meta:model = Devicefields = ['name', 'ip_address', 'type', 'description']widgets = {'description': forms.Textarea(attrs={'rows': 4}),}labels = {'name': '设备名称','ip_address': 'IP地址','type': '设备类型','description': '描述',}

第五步:设计前端页面 (Templates)

创建以下模板文件目录结构和内容。

  1. 基础模板 devices/templates/base.html:
    <!DOCTYPE html>
    <html lang="zh">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>设备管理系统</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body><nav class="navbar navbar-expand-lg navbar-dark bg-dark"><div class="container-fluid"><a class="navbar-brand" href="{% url 'device_list' %}">设备管理</a><div class="navbar-nav ms-auto">{% if user.is_authenticated %}<span class="navbar-text me-3">你好,{{ user.username }}</span><form method="post" action="{% url 'user_logout' %}">{% csrf_token %}<button type="submit" class="btn btn-outline-light btn-sm">登出</button></form>{% else %}<a class="nav-link" href="{% url 'user_login' %}">登录</a>{% endif %}</div></div></nav><div class="container mt-4"><!-- 消息提示 -->{% if messages %}{% for message in messages %}<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">{{ message }}<button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>{% endfor %}{% endif %}<!-- 主要内容 -->{% block content %}{% endblock %}</div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
    </body>
    </html>
    
  2. 登录页面 devices/templates/registration/login.html:
    {% extends 'base.html' %}{% block content %}
    <div class="row justify-content-center"><div class="col-md-6"><h2 class="mb-4">用户登录</h2><form method="post">{% csrf_token %}<div class="mb-3"><label for="username" class="form-label">用户名</label><input type="text" class="form-control" id="username" name="username" required></div><div class="mb-3"><label for="password" class="form-label">密码</label><input type="password" class="form-control" id="password" name="password" required></div><button type="submit" class="btn btn-primary">登录</button></form></div>
    </div>
    {% endblock %}
    
  3. 设备列表页 devices/templates/devices/device_list.html:
    {% extends 'base.html' %}{% block content %}
    <div class="d-flex justify-content-between align-items-center mb-4"><h2>我的设备列表</h2><a href="{% url 'device_create' %}" class="btn btn-success">+ 添加新设备</a>
    </div>{% if devices %}
    <div class="table-responsive"><table class="table table-striped table-hover"><thead class="table-dark"><tr><th>设备名称</th><th>IP地址</th><th>类型</th><th>创建时间</th><th>操作</th></tr></thead><tbody>{% for device in devices %}<tr><td>{{ device.name }}</td><td>{{ device.ip_address }}</td><td>{{ device.get_type_display }}</td><td>{{ device.created_at|date:"Y-m-d H:i" }}</td><td><a href="{% url 'device_update' device.pk %}" class="btn btn-sm btn-outline-primary">编辑</a><a href="{% url 'device_delete' device.pk %}" class="btn btn-sm btn-outline-danger">删除</a></td></tr>{% endfor %}</tbody></table>
    </div>
    {% else %}
    <div class="alert alert-info">您还没有添加任何设备。 <a href="{% url 'device_create' %}">点击添加</a></div>
    {% endif %}
    {% endblock %}
    
  4. 设备表单页(创建/编辑共用) devices/templates/devices/device_form.html:
    {% extends 'base.html' %}{% block content %}
    <h2 class="mb-4">{{ title }}</h2>
    <form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit" class="btn btn-primary">保存</button><a href="{% url 'device_list' %}" class="btn btn-secondary">取消</a>
    </form>
    {% endblock %}
    
  5. 删除确认页 devices/templates/devices/device_confirm_delete.html:
    {% extends 'base.html' %}{% block content %}
    <h2 class="mb-4">确认删除</h2>
    <p>你确定要删除设备 <strong>{{ device.name }}</strong> ({{ device.ip_address }}) 吗?此操作不可逆。</p>
    <form method="post">{% csrf_token %}<button type="submit" class="btn btn-danger">是的,删除</button><a href="{% url 'device_list' %}" class="btn btn-secondary">取消</a>
    </form>
    {% endblock %}
    

第六步:配置路由 (URL)

  1. 应用级路由 devices/urls.py (需要创建这个文件):
    from django.urls import path
    from . import viewsapp_name = 'devices'urlpatterns = [path('', views.device_list, name='device_list'),path('login/', views.user_login, name='user_login'),path('logout/', views.user_logout, name='user_logout'),path('new/', views.device_create, name='device_create'),path('<int:pk>/edit/', views.device_update, name='device_update'),path('<int:pk>/delete/', views.device_delete, name='device_delete'),
    ]
    
  2. 项目级路由 my_site/urls.py:
    from django.contrib import admin
    from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('devices.urls')), # 将根路径指向 devices 应用的路由
    ]
    

第七步:运行测试

# 创建超级用户,用于登录后台和管理用户(可选,但推荐)
python manage.py createsuperuser
# 按照提示输入用户名、邮箱和密码# 启动开发服务器
python manage.py runserver
  1. 打开浏览器访问 http://127.0.0.1:8000
  2. 你应该会被重定向到登录页面。你可以使用刚刚创建的超级用户登录。
  3. 登录成功后,你会看到设备列表页(初始为空)。
  4. 点击“添加新设备”进行测试。

功能清单验证:

· ✅ 用户登录/登出
· ✅ 设备列表显示(只显示当前用户的)
· ✅ 创建设备
· ✅ 编辑设备
· ✅ 删除设备(有确认提示)

这个系统已经具备了核心功能。你可以在此基础上继续扩展,比如添加更复杂的设备字段、实现搜索过滤、添加分页功能等。Django Admin 后台 (/admin) 也可以直接管理所有设备和用户数据。

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

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

相关文章

微软依旧稳定发挥,Windows 最新更新性能「开倒车」

微软在前不久为Release Preview测试用户推送了最新Windows11 25H2版本。按照惯例&#xff0c;正式版将于9月或者10月与咱们见面。虽然看起来是个跨版本的大更新&#xff0c;但是更新方式将服务堆栈更新&#xff08;SSU&#xff09;与最新累积更新&#xff08;LCU&#xff09;。…

一手实测,文心x1.1的升级很惊喜啊

一手实测&#xff0c;文心x1.1的升级很惊喜啊 前言 月9日&#xff0c;在 WAVE SUMMIT深度学习开发者大会上 百度发布了一个新的思考模型文心x1.1&#xff1a; X1 Turbo 升级为 X1.1 了。 文心4.5 Turbo 和 X1 Turbo 是2025年4月25日发布的&#xff0c;距今已经半年过去了&…

Flask 核心基础:从 路由装饰器 到 __name__ 变量 的底层逻辑解析

Flask 核心基础&#xff1a;从路由装饰器到 name 变量的底层逻辑解析 在使用 Flask 开发 Web 应用时&#xff0c;我们总会从 app Flask(__name__) 和 app.route("/") 这两行代码开始。看似简单的语法背后&#xff0c;藏着 Python 装饰器机制与 Flask 框架设计的核心…

中国AI云市场报告:阿里云份额达35.8%,高于2至4名总和

9月9日&#xff0c;国际权威市场调研机构英富曼&#xff08;Omdia&#xff09;发布《中国AI云市场&#xff0c;1H25》报告&#xff0c;报告显示&#xff0c;2025年上半年&#xff0c;中国AI云市场规模达223亿元&#xff0c;阿里云占比35.8%位列第一&#xff0c;市场份额高于2到…

鸿蒙Next开发指南:UIContext接口解析与全屏拉起元服务实战

前言在鸿蒙应用开发过程中&#xff0c;我们经常会遇到需要获取UI上下文实例或者在非UI上下文中调用UI相关方法的场景。随着HarmonyOS NEXT的不断发展&#xff0c;UIContext API为我们提供了更加优雅的解决方案。本文将详细介绍如何使用UIContext中对应的接口获取与实例绑定的对…

leaflet读取mvt格式

如图所示&#xff0c;是全国的数据&#xff0c;截图是部分数据先安装&#xff1a;npm install leaflet npm install leaflet.vectorgrid如果是其余的框架直接用就行&#xff1a;import * as L from leaflet; import leaflet.vectorgrid;我用的是angular,所以是ts中声明&#xf…

OSG中交互(鼠标、键盘)处理

OpenSceneGraph (OSG) 中的交互处理,包括鼠标和键盘事件。 一、OSG 事件处理体系 OSG 使用一个基于访问者模式的事件处理体系,核心类包括: osgGA::GUIEventHandler: 所有事件处理器的基类 osgViewer::Viewer: 查看器,管理事件队列和分发 osgGA::EventQueue: 事件队列…

微硕双N-MOS管WST3392在汽车智能氛围灯系统中的应用

汽车智能氛围灯系统是现代车辆提升驾乘体验的重要配置&#xff0c;其多通道LED的精密调光与控制需选用高性能、小体积的功率开关器件。微硕WINSOK的WST3392是一款双N沟道MOS管&#xff0c;具有30V耐压、3.7A连续电流和46mΩ的低导通电阻&#xff0c;特别适用于氛围灯系统中的多…

深入 Kubernetes:从零到生产的工程实践与原理洞察

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

为何三折叠手机只有华为可以?看华为Mate XTs非凡大师就知道

9月4日&#xff0c;华为在深圳举行华为Mate XTs非凡大师及全场景新品发布会&#xff0c;不同于过往手机发布会对芯片配置只字不提&#xff0c;此次发布会公开展示了华为Mate XTs非凡大师内部芯片配置——麒麟9020芯片&#xff0c;时隔四年&#xff0c;终于在发布会上看到芯片公…

TensorFlow 2.x 核心 API 与模型构建

TensorFlow 2.x 核心 API 与模型构建TensorFlow 是一个强大的开源机器学习库&#xff0c;尤其在深度学习领域应用广泛。TensorFlow 2.x 在易用性和效率方面做了大量改进&#xff0c;引入了Keras作为其高级API&#xff0c;使得模型构建和训练更加直观和便捷。本文将介绍 TensorF…

TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接

在工业控制、户外电子、水下设备等对连接稳定性与防护性要求极致的场景中&#xff0c;TENGJUN防水TYPE-C连接器以“硬核性能全面认证”的双重优势&#xff0c;成为关键连接环节的信赖之选。从结构设计到认证标准&#xff0c;每一处细节都为应对复杂环境而生&#xff0c;重新定义…

【小呆的随机振动力学笔记】概率论基础

文章目录0. 概率论基础0.1 概率的初步认知0.2 随机变量的分布0.3 随机变量的数字特征0.3.1 随机变量的期望算子0.3.2 随机变量的矩0.4 随机变量的特征函数0.5 高数基础附录A 典型分布0. 概率论基础 \quad\quad在生活中或自然中&#xff0c;处处都存在随机现象&#xff0c;比如每…

使用海康机器人相机SDK实现基本参数配置(C语言示例)

在机器视觉项目开发中&#xff0c;相机的初始化、参数读取与设置是最基础也是最关键的环节。本文基于海康机器人&#xff08;Hikrobot&#xff09;提供的MVS SDK&#xff0c;使用C语言实现了一个简洁的控制程序&#xff0c;完成设备枚举、连接以及常用参数的获取与设置。 &…

【IoTDB】时序数据库选型指南:为何IoTDB成为工业大数据场景的首选?

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈大数据与数据库应用⌋⌋⌋ 大数据是规模庞大、类型多样且增长迅速的数据集合&#xff0c;需特殊技术处理分析以挖掘价值。数据库作为数据管理的关键工具&#xff0c;具备高效存储、精准查询与安全维护能力。二者紧密结合&#xff0…

用计算思维“破解”复杂Excel考勤表的自动化之旅

在我们日常工作中&#xff0c;经常会遇到一些看似简单却极其繁琐的任务。手动处理一份结构复杂的Excel考勤表&#xff0c;就是典型的例子。它充满了合并单元格、不规则的布局和隐藏的格式陷阱。面对这样的挑战&#xff0c;我们是选择“卷起袖子&#xff0c;日复一日地手动复制粘…

PAT 1006 Sign In and Sign Out

1006 Sign In and Sign Out分数 25作者 CHEN, Yue单位 浙江大学At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing ins and outs, yo…

【git】首次clone的使用采用-b指定了分支,还使用了--depth=1 后续在这个基础上拉取所有的分支代码方法

要解决当前问题&#xff08;从浅克隆转换为完整克隆并获取所有分支&#xff09;&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;检查当前远程地址 首先确认远程仓库地址是否正确&#xff1a; git remote -v步骤 2&#xff1a;修改远程配置以获取所有分支 默认浅…

萝卜切丁机 机构笔记

萝卜切丁机_STEP_模型图纸免费下载 – 懒石网 机械工程师设计手册 1是传送带 2是曲柄滑块机构&#xff1f; 挤压动作

多张图片生成视频模型技术深度解析

多张图片生成视频模型测试相比纯文本输入&#xff0c;有视觉参考约束的生成通常质量更稳定&#xff0c;细节更丰富 1. 技术原理和工作机制 多张图片生成视频模型是一种先进的AI技术&#xff0c;能够接收多张输入图像&#xff0c;理解场景变化关系&#xff0c;并合成具有时间连…