Django学习笔记02

本文介绍了在Django中如何创建模型表结构,包括外键的级联删除和置空策略。接着讲解了模板继承的概念,通过布局.html作为母版减少代码重复。最后讨论了Form和ModelForm在生成前端表单中的作用,ModelForm提供了更简便的方式实例化数据库模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 方法1: 级联删除
# 使用联结表,使用外键关联DepartmentDemo02表中的id列
# 设置on_delete=on_delete=models.CASCADE表示级联删除
depart = models.ForeignKey(to="DepartmentDemo02", to_field="id", on_delete=models.CASCADE)
  1. 方法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 %}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值