服务器管理
class Server(models.Model):
"""服务器表"""
hostname = models.CharField(verbose_name='主机名',max_length=64)
利用 modelform 实现服务器表的增删改查
所有的项目大部分的功能都是由最简单的增删改查组成,是你整个业务逻辑的基础
并且我们只需要认认真真的写一个增删改查即可,后续所有的直接 CV 大法完事!!!
模版的基础作为模版的 html 文件上一般情况下
都应该定义三个区域 css 区,html 内容区,js 区
针对服务器添加数据的功能,需要对提交的数据进行数据校验,还需要展示提示信息
当模型字段非常多的时候前端页面展示代码量书写非常多
如何解决上述问题
"""
标签渲染
数据校验
信息展示
forms组件的功能
modelform组件也可以完成上面的三个要求,并且功能更加的强大简单
"""
class ServerModelForm(ModelForm):
class Meta:
model = models.Server
fields = "__all__"
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
# print(self.fields) # OrderedDict([('hostname', <django.forms.fields.CharField object at 0x10c99c198>)])
# 给所有的字段加class属性
for k,field_obj in self.fields.items():
field_obj.widget.attrs['class'] = 'form-control'
return redirect('/server/list/') # 可以写路径
return redirect('server_list') # 还可以写别名 但是如果出现有名无名分组的反响解析 则必须使用reverse方法
语言环境
django 默认的语言环境是英文,但是它的内部其实支持多个国家的语言,只需要你自己手动配置即可
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
# 如何查看django到底支持哪些语言环境
from django.conf import global_settings
LANGUAGES = [
('af', gettext_noop('Afrikaans')),
('ar', gettext_noop('Arabic')),
('ast', gettext_noop('Asturian')),
...
]
针对删除功能,我们想做一个二次确认的过程(ajax 结合 sweetalert 实现二次确认弹框)
<script>
function removeData(ths,sid) {
var res = confirm('你确定要删除吗?');
{#alert(res) // 布尔值#}
if (res){
// 朝后端发送删除数据的请求
$.ajax({
url:'/server/delete/' + sid + '/',
type:'get',
success:function (args) {
// 删除成功之后 页面应该立刻展示删除之后的效果
// 1 直接刷新 不太好 设计到分页的情况不太好
{#window.location.reload()#}
if (args.status){
// 2 利用DOM操作实时删除
$(ths).parent().parent().remove()
}
}
})
}
}
</script>
项目管理
class Project(models.Model):
"""项目表"""
title = models.CharField(verbose_name='项目名',max_length=64)
repo = models.CharField(verbose_name='仓库地址',max_length=128)
env_choices = (
('prod','正式'),
('test','测试')
)
env = models.CharField(verbose_name='环境',max_length=16,choices=env_choices,default='test')
直接搬砖操作,CV搞定
代码的优化
代码的优化一定是在你把功能实现之后再去优化(先努力实现再考虑优化)
-
将所有的 modelform 单独抽取出来
-
将 modelform 类中所有公共的部分抽取出来形成基类
"""
什么是类?
类是对象公共的属性和技能的结合体
什么是父类?
父类是类公共的属性和技能的结合体
"""
# 父类
from django.forms import ModelForm
class BaseModelForm(ModelForm):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
# print(self.fields) # OrderedDict([('hostname', <django.forms.fields.CharField object at 0x10c99c198>)])
# 给所有的字段加class属性
for k,field_obj in self.fields.items():
field_obj.widget.attrs['class'] = 'form-control'
# 子类
from app01.myforms.base import BaseModelForm
from app01 import models
class ServerModelForm(BaseModelForm):
class Meta:
model = models.Server
fields = "__all__"
当模型表字段特别多的时候,并且并不是所有的字段都需要展示到前端给用户观看
from django.forms import ModelForm
class BaseModelForm(ModelForm):
# 自定义字段是否需要加额外属性的配置
exclude_bootstrap = []
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
# print(self.fields) # OrderedDict([('hostname', <django.forms.fields.CharField object at 0x10c99c198>)])
# 给所有的字段加class属性
for k,field_obj in self.fields.items():
if k in self.exclude_bootstrap:
continue # 排除在外不添加样式
field_obj.widget.attrs['class'] = 'form-control'
项目表需要额外添加字段
# 线上服务器地址
path = models.CharField(verbose_name='线上地址',max_length=64)
# 关联服务器
"""
一个项目可以跑在多个服务器上
一个服务器其实也可以跑多个项目 (公司服务器不够的时候 可以混用)
"""
servers = models.ManyToManyField(to='Server',verbose_name='关联服务器')