1、models.py
from django.db import models
# Create your models here.
class Department(models.Model):
'''部门表'''
title = models.CharField(verbose_name='标签',max_length=32)
# 实例化对象用print输出时是一个对象,__str__(self) 可以打印具体的属性
def __str__(self):
return self.title
class UserInfo(models.Model):
'''员工表'''
name = models.CharField(verbose_name="姓名",max_length=16)
password = models.CharField(verbose_name="密码",max_length=64)
age = models.IntegerField(verbose_name="年龄")
# account decimal(10,2) 小数
account = models.DecimalField(verbose_name="账户余额",max_digits=10,decimal_places=2,default=0)
# create_time = models.DateTimeField(verbose_name="入职时间")
create_time = models.DateField(verbose_name="入职时间")
# depart_id 为外键,连接Department表中的id
# - to,与哪张表关联
# - to_field,表中的哪一列关联
# on_delete=models.CASCADE() 表示删除时级联
# 2.django自动
# - 写的depart
# - 生成数据列 depart_id
# 3.部门表被删除
# ### 3.1 级联删除
depart = models.ForeignKey(verbose_name="部门",to="Department",to_field="id",on_delete=models.CASCADE)
# ### 3.2 on_delete=models.SET_NULL 表示删除时置空
# depart = models.ForeignKey(to="Department",to_field="id",null=True,blank=True,on_delete=models.SET_NULL)
# 在django中做的约束
gender_choices = (
(1,"男"),
(2,"女"),
)
gender = models.SmallIntegerField(verbose_name="性别",choices=gender_choices)
# level_choices = (
# (1, "0级"),
# (2, "1级"),
# )
# level = models.SmallIntegerField(verbose_name="级别",choices=level_choices)
2、urls.py
from django.contrib import admin
from django.urls import path
from my_app import views
urlpatterns = [
path('user/list/', views.user_list),
path('user/add/', views.user_add),
path('user/model/form/add/', views.user_model_form_add),
path('user/del/', views.user_del),
path('user//up/', views.user_up), # 访问形式:http://127.0.0.1:8000/user/1/up/
path('user//edit/', views.user_edit), # 访问形式:http://127.0.0.1:8000/user/1/edit/
]
3、views.py
# 用户列表
def user_list(request):
userLists = models.UserInfo.objects.all()
for user in userLists:
# 性别是元组:(1,"男"),(2,"女") user.gender为数字
# user.get_gender_display()为数字对应的属性 user.get_字段属性_display()
# user.create_time.strftime("%Y-%m-%d") 将datetime类型转换为字符串类型
print(user.id,user.name,user.password,user.age,user.account,user.create_time.strftime("%Y-%m-%d"),user.get_gender_display(),user.depart.title)
user.depart_id # 获取数据库中存储的那个字段值
user.depart # 根据id自动去关联的表中获取那一行数据depart对象。
# print(user.depart_id,user.depart.title)
return render(request,"user_list.html",{"user_list":userLists})
# 删除用户
def user_del(request):
user_id = request.GET.get("id")
models.UserInfo.objects.filter(id=user_id).delete()
return redirect("/user/list/")
# ************* ModelForm 示例 *************
# from django import forms
class DateInput(forms.DateInput):
input_type = 'date'
class UserModelForm(forms.ModelForm):
# 对字段属性加限制条件
name = forms.CharField(min_length=2,label="姓名") # 限制条件:至少输入2个字符
# create_time = forms.DateTimeField(label="入职时间") # 限制条件:必须是时间格式
# validators 正则表达式:密码至少包含 数字和英文,长度6-20 validators="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$"
# password = forms.CharField(label="密码")
class Meta:
model = models.UserInfo
fields = ["name","password","age","account","create_time","gender","depart"]
# widgets = { # 加css样式
# # "name": forms.TextInput(attrs={"class": "form-control"}),
# "password": forms.PasswordInput(attrs={"class": "form-control","placeholder": "密码"}),
# # "age": forms.TextInput(attrs={"class": "form-control"}),
# "create_time": DateInput(attrs={"class": "form-control dt"}),
#
# }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循环找到所有的插件,添加了
for name,field in self.fields.items():
# if name == "password":
# continue
# if name == "create_time" or name == "password":
# continue
# # 多添加一个id属性
# # field.widget.attrs = {"class": "form-control dt", "placeholder": field.label}
# else:
# field.widget.attrs = {"class": "form-control", "placeholder": field.label}
field.widget.attrs = {"class": "form-control", "placeholder": field.label}
# 添加用户ModelForm
def user_model_form_add(request):
''' 添加用户ModelForm '''
req_method = request.method
if req_method == 'GET':
form = UserModelForm()
return render(request, "user_model_form_add.html", {"form": form})
# 用户POST提交数据,数据校验
form = UserModelForm(data=request.POST)
if form.is_valid(): # 数据校验成功
# 如果数据合法,就存到数据库
print(form.cleaned_data) # {'name': '333', 'password': '333', 'age': 33, 'account': Decimal('333'), 'create_time': datetime.datetime(2021, 11, 11, 0, 0, tzinfo=), 'gender': 1, 'depart': }
# models.UserInfo.objects.create(...) # 把数据存到数据库中 方式1
# 方式2(推荐)
form.save() # 直接将数据存储到数据库
return redirect("/user/list/")
# 数据校验失败
# else:
# print(form.errors) 数据校验错误信息
return render(request, "user_model_form_add.html", {"form": form})
# 更新用户(ModelForm格式)
def user_edit(request,uid):
req_method = request.method
# 根据id获取数据对象
user = models.UserInfo.objects.filter(id=uid).first()
if req_method == 'GET':
form = UserModelForm(instance=user)
return render(request, "user_model_form_edit.html", {"form": form})
# data是从页面传过来的更新数据,instance表示要更新的那个数据
form = UserModelForm(data=request.POST,instance=user)
# 数据校验
if form.is_valid():
# form.save() 默认保存的是用户输入的所有数据
# 如果想除了保存用户输入的值之外,再添加其他值 用 form.instance.字段名 = 值
# form.instance.password = "123456"
form.save() # 直接将数据存储到数据库
return redirect("/user/list/")
# 数据校验失败
return render(request,"user_model_form_edit.html",{"form": form})
4、layout.html (模板)
{% load static %}
Title
{% block css %}{% endblock %}
{% block content %} {% endblock %}
{% block js %}{% endblock %}
5、user_list.html
{% extends 'layout.html' %}
{% block content %}
{# #}
新建用户
新建用户ModelForm
用户列表
| id |
姓名 |
密码 |
年龄 |
账户余额 |
入职时间 |
性别 |
所属部门 |
操作 |
{% for user in user_list %}
| {{ user.id }} |
{{ user.name }} |
{{ user.password }} |
{{ user.age }} |
{{ user.account }} |
{{ user.create_time|date:"Y-m-d" }} |
{{ user.get_gender_display }} |
{{ user.depart.title }} |
{ user.id }}/edit/" >编辑
{# { user.id }}/up/" >编辑#}
{# { user.id }}" >编辑#}
{ user.id }}" >删除
|
{% endfor %}
{% endblock %}
6、user_model_form_add.html
{% extends 'layout.html' %}
{% load static %}
{% block content %}
添加用户
{% endblock %}
{% block js %}
{# #}
{# #}
{% endblock %}
{##}
{##}
{##}
{#
#}
{#
Title#}
{##}
{##}
{##}
{##}
{##}
{#
#}
{##}
{##}
7、user_model_form_edit.html
{% extends 'layout.html' %}
{% load static %}
{% block content %}
添加用户
{% endblock %}
{% block js %}
{# #}
{# #}
{% endblock %}
8、效果图