Quellcode durchsuchen

更新了Django第三天代码

jackfrued vor 7 Jahren
Ursprung
Commit
96719b5559

+ 1 - 0
.gitignore

@@ -1,4 +1,5 @@
 venv
 .idea
 *.pyc
+__pycache__
 

+ 0 - 41
Day32/oa/hrs/migrations/0001_initial.py

@@ -1,41 +0,0 @@
-# Generated by Django 2.0.5 on 2018-05-22 03:07
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Dept',
-            fields=[
-                ('no', models.IntegerField(primary_key=True, serialize=False)),
-                ('name', models.CharField(max_length=20)),
-                ('location', models.CharField(max_length=10)),
-            ],
-            options={
-                'db_table': 'tb_dept',
-            },
-        ),
-        migrations.CreateModel(
-            name='Emp',
-            fields=[
-                ('no', models.IntegerField(primary_key=True, serialize=False)),
-                ('name', models.CharField(max_length=20)),
-                ('job', models.CharField(max_length=10)),
-                ('mgr', models.IntegerField(null=True)),
-                ('sal', models.DecimalField(decimal_places=2, max_digits=7)),
-                ('comm', models.DecimalField(decimal_places=2, max_digits=7, null=True)),
-                ('dept', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='hrs.Dept')),
-            ],
-            options={
-                'db_table': 'tb_emp',
-            },
-        ),
-    ]

+ 10 - 0
Day32/oa/hrs/models.py

@@ -1,10 +1,20 @@
 from django.db import models
 
+# ORM - 对象关系映射
+# 对象模型  <--->   关系模型
+# 实体类    <--->   二维表
+# 属性      <--->   列
+# 对象      <--->   记录
+
 
 class Dept(models.Model):
     no = models.IntegerField(primary_key=True, verbose_name='部门编号')
     name = models.CharField(max_length=20, verbose_name='部门名称')
     location = models.CharField(max_length=10, verbose_name='部门所在地')
+    excellent = models.BooleanField(default=0, verbose_name='是否优秀')
+
+    def __str__(self):
+        return self.name
 
     class Meta:
         db_table = 'tb_dept'

+ 9 - 0
Day32/oa/hrs/urls.py

@@ -0,0 +1,9 @@
+from django.urls import path
+
+from hrs import views
+
+urlpatterns = [
+    path('depts', views.depts, name='depts'),
+    path('depts/emps', views.emps, name='empsindept'),
+    path('deldepts', views.del_dept, name='ddel')
+]

+ 19 - 4
Day32/oa/hrs/views.py

@@ -1,4 +1,5 @@
-from django.shortcuts import render
+from django.shortcuts import render, redirect
+from django.urls import reverse
 
 from hrs.models import Dept, Emp
 
@@ -10,12 +11,26 @@ def index(request):
     return render(request, 'index.html', context=ctx)
 
 
+def del_dept(request):
+    # 重定向 - 重新请求一个指定的页面
+    return redirect(reverse('depts'))
+
+
 def emps(request):
-    dno = int(request.GET['dno'])
+    no = request.GET['no']
+    # dept = Dept.objects.get(no=no)
+    # ForeignKey(Dept, on_delete=models.PROTECT, related_name='emps')
+    # dept.emps.all()
+    # emps_list = dept.emp_set.all()
+    # all() / filter() ==> QuerySet
+    # QuerySet使用了惰性查询 - 如果不是非得取到数据那么不会发出SQL语句
+    # 这样做是为了节省服务器内存的开销 - 延迟加载 - 节省空间势必浪费时间
+    emps_list = list(Emp.objects.filter(dept__no=no).select_related('dept'))
+    ctx = {'emp_list': emps_list, 'dept_name': emps_list[0].dept.name} \
+        if len(emps_list) > 0 else {}
+    return render(request, 'emp.html', context=ctx)
 
 
 def depts(request):
-    # DRY - Don't Repeat Yourself
-    # ORM - Object Relation Mapping
     ctx = {'dept_list': Dept.objects.all()}
     return render(request, 'dept.html', context=ctx)

+ 18 - 0
Day32/oa/oa/settings.py

@@ -126,3 +126,21 @@ USE_TZ = True
 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
 
 STATIC_URL = '/static/'
+
+# 配置将日志输出到控制台 日志级别为DEBUG(最详细的日志)
+# DEBUG < INFO < WARNING < ERROR < CRITICAL
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'handlers': {
+        'console': {
+            'class': 'logging.StreamHandler',
+        },
+    },
+    'loggers': {
+        'django': {
+            'handlers': ['console'],
+            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
+        },
+    },
+}

+ 2 - 2
Day32/oa/oa/urls.py

@@ -14,12 +14,12 @@ Including another URLconf
     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
 """
 from django.contrib import admin
-from django.urls import path
+from django.urls import path, include
 
 from hrs import views
 
 urlpatterns = [
     path('', views.index),
     path('admin/', admin.site.urls),
-    path('hrs/depts', views.depts)
+    path('hrs/', include('hrs.urls')),
 ]

+ 11 - 2
Day32/oa/templates/dept.html

@@ -22,6 +22,7 @@
                     <th>部门编号</th>
                     <th>部门名称</th>
                     <th>部门所在地</th>
+                    <th>是否优秀</th>
                     <th>操作</th>
                 </tr>
                 </thead>
@@ -30,11 +31,19 @@
                     <tr>
                         <td>{{ dept.no }}</td>
                         <td>
-                            <a href="/hrs/emps?dno={{ dept.no }}">{{ dept.name }}</a>
+                            <!-- 写代码时要尽量避免使用硬编码(hard code) -->
+                            <a href="{% url 'empsindept' %}?no={{ dept.no }}">{{ dept.name }}</a>
                         </td>
                         <td>{{ dept.location }}</td>
                         <td>
-                            <a href="/hrs/deldept?dno={{ dept.no }}" class="btn btn-xs btn-warning">删除</a>
+                            {% if dept.excellent %}
+                                <span style="color: green;">√</span>
+                            {% else %}
+                                <span style="color: red;">×</span>
+                            {% endif %}
+                        </td>
+                        <td>
+                            <a href="{% url 'ddel' %}?dno={{ dept.no }}" class="btn btn-xs btn-warning">删除</a>
                         </td>
                     </tr>
                     {% endfor %}

+ 60 - 0
Day32/oa/templates/emp.html

@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+{% load static %}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>员工</title>
+    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
+</head>
+<body>
+<div class="container">
+    <div class="row clearfix">
+		<div class="col-md-12 column">
+			<h3>{{ dept_name }}员工信息</h3>
+            <hr>
+		</div>
+	</div>
+    <div class="row clearfix">
+        <div class="col-md-8 column">
+            {% if emp_list %}
+            <table id="dept" class="table table-striped table-hover">
+                <thead>
+                <tr>
+                    <th>编号</th>
+                    <th>姓名</th>
+                    <th>职位</th>
+                    <th>月薪</th>
+                    <th>部门名称</th>
+                </tr>
+                </thead>
+                <tbody>
+                    {% for emp in emp_list %}
+                    <tr>
+                        <td>{{ emp.no }}</td>
+                        <td>{{ emp.name }}</td>
+                        <td>{{ emp.job }}</td>
+                        <td>{{ emp.sal }}</td>
+                        <td>{{ dept_name }}</td>
+                    </tr>
+                    {% endfor %}
+                </tbody>
+            </table>
+            {% else %}
+                <h2>此部门暂时没有员工!</h2>
+            {% endif %}
+        </div>
+        <div class="col-md-4 column">
+        </div>
+    </div>
+    <a href="{% url 'depts' %}">返回部门列表</a>
+</div>
+<script src="{% static 'js/jquery.min.js' %}"></script>
+<script src="{% static 'js/bootstrap.min.js' %}"></script>
+<script>
+    $(function() {
+        $('#dept tbody tr:even').addClass('info');
+        $('#dept tbody tr:odd').addClass('warning');
+    });
+</script>
+</body>
+</html>