DjangoDay02
1.创建表结构
- 在【models.py】文件中创建表结构。
class DepartmentDemo02(models.Model):
"""部门表"""
title = models.CharField(verbose_name="标题", max_length=32)
class UserInfoDemo02(models.Model):
"""员工表"""
name = models.CharField(verbose_name="姓名", max_length=16)
password = models.CharField(verbose_name="密码", max_length=64)
age = models.IntegerField(verbose_name="年龄")
account = models.DecimalField(verbose_name="账户余额", max_digits=10, decimal_places=2, default=0)
create_time = models.DateTimeField(verbose_name="入职时间")
# 使用联结表,使用外键关联DepartmentDemo02表中的id列
depart = models.ForeignKey(to="DepartmentDemo02", to_field="id", on_delete=models.CASCADE)
# 约束内容
gender_choices = (
(0, "女"),
(1, "男")
)
gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)
- 联结表的删除问题
当外键对应的内容被删除时,引用外键的表可以有两种操作方式:
- 方法1: 级联删除
# 使用联结表,使用外键关联DepartmentDemo02表中的id列
# 设置on_delete=on_delete=models.CASCADE表示级联删除
depart = models.ForeignKey(to="DepartmentDemo02", to_field="id", on_delete=models.CASCADE)
- 方法2:置空
# 使用联结表,使用外键关联DepartmentDemo02表中的id列
# 设置on_delete=models.SET_NULL表示置空,但同时需要设置允许可为空
depart = models.ForeignKey(to="DepartmentDemo02", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)
- 创建表
python manage.py makemigrations
python manage.py migrate
- 问题
在使用migrate命令进行创建表时,因为数据配置错误,未能成功创建表,修正数据库连接后,仍然无法创建表结构。
解决方法:
在数据库的django_migrations表内存储了migrate记录,删除指定app的记录后,方可重新创建表。
2. 模板的继承
可以在templates目录下定义一个母版文件,在其他文件中可以使用模板语法引入母版,减少代码耦合度,提高效率。
例如,创建一个【layout.html】
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="{% static "plugins/bootstrap-3.4.1/css/bootstrap.min.css" %}">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">用户管理系统</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/depart/list">部门管理</a></li>
<li><a href="/user/list">用户管理</a></li>
{# <li><a href="#">Link1</a></li>#}
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">登陆</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">张三<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">个人资料</a></li>
<li><a href="#">我的信息</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">注销</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
{% block content %}{% endblock %}
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>
在此文件中,定义了两个block区域,可供继承的文件进行补充。
例如,在【depart.html】文件中继承母版:
{% extends "layout.html" %} <!-- 继承母版 -->
{% block title %}Depart Add{% endblock %} <!-- 修改title区域 -->
{% block content %} <!-- 修改content区域 -->
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
<span>新建部门</span>
</div>
<div class="panel-body">
<table class="table table-bordered">
<form class="form-inline" action="/depart/add/" method="post">
{% csrf_token %}
<div class="form-group">
<label for="departInputName2">部门名称:</label>
<input type="text" class="form-control" id="departInputName2" name="name">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-success">添加</button>
</div>
</form>
</table>
</div>
</div>
</div>
{% endblock %}
3.Django的Form和ModelForm方法
- 使用Form方法可以使Django自行产出对应From的Html代码,简化前端表单的生成。
views.py
class UserForm(forms.Form):
# 使用Django的Form类
username = forms.CharField(label="姓名", max_length=16, widget=forms.TextInput(attrs={"class": "form-control"}))
password = forms.CharField(label="密码", max_length=64,
widget=forms.TextInput(attrs={"class": "form-control", "type": "password"}))
age = forms.IntegerField(label="年龄", widget=forms.TextInput(attrs={"class": "form-control"}))
account = forms.DecimalField(label="账户余额", max_digits=10, decimal_places=2,
widget=forms.TextInput(attrs={"class": "form-control"}))
create_time = forms.DateTimeField(label="入职时间", widget=forms.TextInput(attrs={"class": "form-control"}))
departs = ((item.id, item.title) for item in models.DepartmentDemo02.objects.all())
# Choice类需要定义选项元组
depart = forms.ChoiceField(label="部门", choices=departs,
widget=forms.ChoiceField.widget(attrs={"class": "form-control"}))
gender = forms.ChoiceField(label="性别", choices=models.UserInfoDemo02.gender_choices,
widget=forms.ChoiceField.widget(attrs={"class": "form-control"}))
HTML代码
{% extends "layout.html" %}
{% block title %}User Add{% endblock %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
<span>添加用户</span>
</div>
<div class="panel-body">
<table class="table table-bordered">
<form class="form-inline" action="/user/add/" method="post">
{% csrf_token %}
{{ form }}
<div class="form-group">
<button type="submit" class="btn btn-primary btn-success">添加</button>
</div>
</form>
</table>
</div>
</div>
</div>
{% endblock %}
使用Form方法可以简化前端代码,但是仍较为麻烦
- ModelFrom可以实例化数据库的表结构,使得比Form方法更加简便的生成表单结构。
views.py
class UserModelForm(forms.ModelForm):
name = forms.CharField(min_length=3, label="用户名")
class Meta:
model = models.UserInfoDemo02
fields = ["name", "password", "age", 'account', 'create_time', "gender", "depart"]
# widgets = {
# "name": forms.TextInput(attrs={"class": "form-control"}),
# "password": forms.PasswordInput(attrs={"class": "form-control"}),
# "age": forms.TextInput(attrs={"class": "form-control"}),
# }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循环找到所有的插件,添加了class="form-control"
for name, field in self.fields.items():
# if name == "password":
# continue
field.widget.attrs = {"class": "form-control", "placeholder": field.label}
HTML代码
{% extends "layout.html" %}
{% block title %}User Add{% endblock %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
<span>添加用户</span>
</div>
<div class="panel-body">
<table class="table table-bordered">
<form class="form-inline" action="/user/add/" method="post">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label>{{ field.label }}</label>
{{ field }}
<span style="color: red;">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<div class="form-group">
<button type="submit" class="btn btn-primary btn-success">添加</button>
</div>
</form>
</table>
</div>
</div>
</div>
{% endblock %}