自动化测试平台-项目表的增删改

项目准备

虚拟环境问题:

python命令走的系统的python3走的是虚拟环境:

因为配了这个快捷键 注释掉就好了

 

 

 

新建django项目,settings.py文件配置修改:

"""
Django settings for adminzdh project.
​
Generated by 'django-admin startproject' using Django 3.2.16.
​
For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/
​
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os
from pathlib import Path
​
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-tu#=94di%p)-z9%q^g0beh5moy-ufefdjecu3-*vbuwza^q@sx'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
​
ALLOWED_HOSTS = []
​
​
# Application definition
​
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]
​
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
​
ROOT_URLCONF = 'adminzdh.urls'
​
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
​
WSGI_APPLICATION = 'adminzdh.wsgi.application'
​
​
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
​
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
​
​
# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
​
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
​
​
# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
# 改动
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
​
USE_L10N = True
​
USE_TZ = True
​
​
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
​
STATIC_URL = '/static/'
# 新加
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
​
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
View Code

 

新建static文件夹导入模板文件

 

 

路由配置urls.py:

from django.contrib import admin
from django.urls import path
from app01 import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('/', views.index, name="index"),
    path('index/', views.index, name="index")
]
View Code

 

视图app01/views.py:

from django.shortcuts import render, HttpResponse
​
​
# Create your views here.
def index(request):
    '''项目主页'''
    return render(request, "base.html")
​
View Code

 

模板templates/base.html:

<!DOCTYPE html>
<!--
This is a starter template page. Use this page to start your new project from
scratch. This page gets rid of all links and provides the needed markup only.
-->
<html lang="en">
<head>
    {% load static %}
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="x-ua-compatible" content="ie=edge"><title>邓鑫</title><!-- Font Awesome Icons -->
    <link rel="stylesheet" href="{% static 'AdminLTE-master/plugins/fontawesome-free/css/all.min.css' %}">
    <!-- Theme style -->
    <link rel="stylesheet" href="{% static 'AdminLTE-master/dist/css/adminlte.min.css' %}">
{#    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">#}
    <!-- Google Font: Source Sans Pro -->
{#    <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">#}
</head>
<body class="hold-transition sidebar-mini">
<div class="wrapper"><!-- Navbar -->
    <nav class="main-header navbar navbar-expand navbar-white navbar-light">
        <!-- Left navbar links -->
        <ul class="navbar-nav">
            <li class="nav-item">
                <a class="nav-link" data-widget="pushmenu" href="#"><i class="fas fa-bars"></i></a>
            </li>
            <li class="nav-item d-none d-sm-inline-block">
                <a href="{% static '/AdminLTE-master/index3.html' %}" class="nav-link">Home</a>
            </li>
            <li class="nav-item d-none d-sm-inline-block">
                <a href="#" class="nav-link">Contact</a>
            </li>
        </ul><!-- SEARCH FORM -->
        <form class="form-inline ml-3">
            <div class="input-group input-group-sm">
                <input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
                <div class="input-group-append">
                    <button class="btn btn-navbar" type="submit">
                        <i class="fas fa-search"></i>
                    </button>
                </div>
            </div>
        </form><!-- Right navbar links -->
        <ul class="navbar-nav ml-auto">
            <!-- Messages Dropdown Menu -->
            <li class="nav-item dropdown">
                <a class="nav-link" data-toggle="dropdown" href="#">
                    <i class="far fa-comments"></i>
                    <span class="badge badge-danger navbar-badge">3</span>
                </a>
                <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
                    <a href="#" class="dropdown-item">
                        <!-- Message Start -->
                        <div class="media">
                            <img src="{% static 'AdminLTE-master/dist/img/user1-128x128.jpg' %}" alt="User Avatar"
                                 class="img-size-50 mr-3 img-circle">
                            <div class="media-body">
                                <h3 class="dropdown-item-title">
                                    Brad Diesel
                                    <span class="float-right text-sm text-danger"><i class="fas fa-star"></i></span>
                                </h3>
                                <p class="text-sm">Call me whenever you can...</p>
                                <p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
                            </div>
                        </div>
                        <!-- Message End -->
                    </a>
                    <div class="dropdown-divider"></div>
                    <a href="#" class="dropdown-item">
                        <!-- Message Start -->
                        <div class="media">
                            <img src="{% static 'AdminLTE-master/dist/img/user8-128x128.jpg' %}" alt="User Avatar"
                                 class="img-size-50 img-circle mr-3">
                            <div class="media-body">
                                <h3 class="dropdown-item-title">
                                    John Pierce
                                    <span class="float-right text-sm text-muted"><i class="fas fa-star"></i></span>
                                </h3>
                                <p class="text-sm">I got your message bro</p>
                                <p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
                            </div>
                        </div>
                        <!-- Message End -->
                    </a>
                    <div class="dropdown-divider"></div>
                    <a href="#" class="dropdown-item">
                        <!-- Message Start -->
                        <div class="media">
                            <img src="{% static 'AdminLTE-master/dist/img/user3-128x128.jpg' %}" alt="User Avatar"
                                 class="img-size-50 img-circle mr-3">
                            <div class="media-body">
                                <h3 class="dropdown-item-title">
                                    Nora Silvester
                                    <span class="float-right text-sm text-warning"><i class="fas fa-star"></i></span>
                                </h3>
                                <p class="text-sm">The subject goes here</p>
                                <p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
                            </div>
                        </div>
                        <!-- Message End -->
                    </a>
                    <div class="dropdown-divider"></div>
                    <a href="#" class="dropdown-item dropdown-footer">See All Messages</a>
                </div>
            </li>
            <!-- Notifications Dropdown Menu -->
            <li class="nav-item dropdown">
                <a class="nav-link" data-toggle="dropdown" href="#">
                    <i class="far fa-bell"></i>
                    <span class="badge badge-warning navbar-badge">15</span>
                </a>
                <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
                    <span class="dropdown-header">15 Notifications</span>
                    <div class="dropdown-divider"></div>
                    <a href="#" class="dropdown-item">
                        <i class="fas fa-envelope mr-2"></i> 4 new messages
                        <span class="float-right text-muted text-sm">3 mins</span>
                    </a>
                    <div class="dropdown-divider"></div>
                    <a href="#" class="dropdown-item">
                        <i class="fas fa-users mr-2"></i> 8 friend requests
                        <span class="float-right text-muted text-sm">12 hours</span>
                    </a>
                    <div class="dropdown-divider"></div>
                    <a href="#" class="dropdown-item">
                        <i class="fas fa-file mr-2"></i> 3 new reports
                        <span class="float-right text-muted text-sm">2 days</span>
                    </a>
                    <div class="dropdown-divider"></div>
                    <a href="#" class="dropdown-item dropdown-footer">See All Notifications</a>
                </div>
            </li>
            <li class="nav-item">
                <a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#"><i
                        class="fas fa-th-large"></i></a>
            </li>
        </ul>
    </nav>
    <!-- /.navbar --><!-- Main Sidebar Container -->
    <aside class="main-sidebar sidebar-dark-primary elevation-4">
        <!-- Brand Logo -->
        <a href="{% static 'AdminLTE-master/index3.html' %}" class="brand-link">
            <img src="{% static 'AdminLTE-master/dist/img/AdminLTELogo.png' %}" alt="AdminLTE Logo"
                 class="brand-image img-circle elevation-3"
                 style="opacity: .8">
            <span class="brand-text font-weight-light">AdminLTE 3</span>
        </a><!-- Sidebar -->
        <div class="sidebar">
            <!-- Sidebar user panel (optional) -->
            <div class="user-panel mt-3 pb-3 mb-3 d-flex">
                <div class="image">
                    <img src="{% static 'AdminLTE-master/dist/img/user2-160x160.jpg' %}" class="img-circle elevation-2"
                         alt="User Image">
                </div>
                <div class="info">
                    <a href="#" class="d-block">Alexander Pierce</a>
                </div>
            </div><!-- Sidebar Menu -->
            <nav class="mt-2">
                <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
                    data-accordion="false">
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i class="nav-icon fas fa-th"></i>
                            <p>
                                Simple Link
                                <span class="right badge badge-danger">New</span>
                            </p>
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i class="nav-icon fas fa-th"></i>
                            <p>
                                Simple Link
                                <span class="right badge badge-danger">New</span>
                            </p>
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i class="nav-icon fas fa-th"></i>
                            <p>
                                Simple Link
                                <span class="right badge badge-danger">New</span>
                            </p>
                        </a>
                    </li>
                </ul>
            </nav>
            <!-- /.sidebar-menu -->
        </div>
        <!-- /.sidebar -->
    </aside><!-- Content Wrapper. Contains page content -->
    <div class="content-wrapper">
        <!-- Content Header (Page header) -->
        <div class="content-header">
            <div class="container-fluid">
                <div class="row mb-2">
                    <div class="col-sm-6">
                        {% block breadcrumb %}
                        <ol class="breadcrumb">
                            <li class="breadcrumb-item"><a href="#">Home</a></li>
                            <li class="breadcrumb-item active">Starter Page</li>
                        </ol>
                        {% endblock %}
                        {#            <h1 class="m-0 text-dark">Starter Page</h1>#}
                        
                    </div><!-- /.col -->
                </div><!-- /.row -->
            </div><!-- /.container-fluid -->
        </div>
        <!-- /.content-header --><!-- Main content -->
        <div class="content">
            <div class="container-fluid">
                <div class="row">
                    <div class="col-lg-12">
​
                        {% block content %}
                            <div class="card card-primary card-outline">
                            <div class="card-header"><h5 class="m-0">title</h5></div>
                            <div class="card-body">
                            </div>
                        </div>
                        {% endblock %}
​
                    </div>
                    <!-- /.col-md-6 -->
                </div>
                <!-- /.row -->
            </div><!-- /.container-fluid -->
        </div>
        <!-- /.content -->
    </div>
    <!-- /.content-wrapper --><!-- Control Sidebar -->
    <aside class="control-sidebar control-sidebar-dark">
        <!-- Control sidebar content goes here -->
        <div class="p-3">
            <h5>Title</h5>
            <p>Sidebar content</p>
        </div>
    </aside>
    <!-- /.control-sidebar --><!-- Main Footer -->
    <footer class="main-footer">
        <!-- To the right -->
        <div class="float-right d-none d-sm-inline">
            Anything you want
        </div>
        <!-- Default to the left -->
        <strong>Copyright &copy; 2014-2019 <a href="https://adminlte.io">AdminLTE.io</a>.</strong> All rights reserved.
    </footer>
</div>
<!-- ./wrapper --><!-- REQUIRED SCRIPTS --><!-- jQuery -->
<script src="{% static 'AdminLTE-master/plugins/jquery/jquery.min.js' %}"></script>
<!-- Bootstrap 4 -->
<script src="{% static 'AdminLTE-master/plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
<!-- AdminLTE App -->
<script src="{% static 'AdminLTE-master/dist/js/adminlte.min.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>
View Code

 

项目表结构设计:app01/models.py:

from django.db import models
​
​
# Create your models here.
class It(models.Model):
    it_name = models.CharField(max_length=32, default="", verbose_name="项目名称")
    it_desc = models.TextField(max_length=255, default="", verbose_name="项目描述")
    it_start_title = models.DateField(verbose_name="项目开始时间")
    it_end_title = models.DateField(verbose_name="项目结束时间")
​
    def __str__(self):
        return self.it_name
​
View Code

 

数据迁移:

python3 manage.py makemigrations
python3 manage.py migrate

 

项目表的增删改查:

views.py:

from django.shortcuts import render, HttpResponse, redirect
from django.http import JsonResponse
from app01 import models
from utils.MyModelForm import ItModelForm
​
​
​
def index(request):
    """ 项目主页 """
    if request.method == "POST":
        return JsonResponse({"code": 0, "message": "项目主页的post请求,非法"})
    else:
        it_obj = models.It.objects.all()
        # print(1111111, it_obj)
        return render(request, 'index.html', {"it_obj": it_obj})
​
def add_it(request):
    """ 添加项目 """
    if request.method == "POST":
        form_data = ItModelForm(request.POST)
        if form_data.is_valid():
            form_data.save()
            return redirect('/index/')
        else:
            return render(request, 'add_it.html', {"it_form_obj": form_data})
    else:
        it_form_obj = ItModelForm()
        return render(request, 'add_it.html', {"it_form_obj": it_form_obj})
​
def edit_it(request, pk):
    """ 编辑项目, pk:项目的pk """
    it_obj = models.It.objects.filter(pk=pk).first()
    if request.method == "POST":
        form_data = ItModelForm(request.POST, instance=it_obj)
        if form_data.is_valid():
            form_data.save()
            return redirect('/index/')
        else:
            return render(request, 'add_it.html', {"it_form_obj": form_data})
    else:
        it_form_obj = ItModelForm(instance=it_obj)
        return render(request, 'edit_it.html', {"it_form_obj": it_form_obj})
​
​
def delete_it(request, pk):
    """ 删除项目表记录,pk:项目的pk """
    models.It.objects.filter(pk=pk).delete()
    return redirect('/index/')
​
​
View Code

 

urls.py:

from django.contrib import admin
from django.urls import path
from app01 import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name="index"),
    path('index/', views.index, name="index"),
    path('add_it/', views.add_it, name='add_it'),
    path(r'edit_it/(?P<pk>\d+)$', views.edit_it, name='edit_it'),
    path(r'delete_it/(?P<pk>\d+)$', views.delete_it, name='delete_it'),
]
View Code

 


modelform

it表

法1

utils/mymodelform.py:

from django.forms import ModelForm
from django import forms
from django.forms import widgets as wid
from app01 import models
​
class ItModelForm(ModelForm):
    class Meta:
        model = models.It
        fields = "__all__"
    bootstrapClass_filter = ['it_start_time', 'it_end_time']
    it_start_time = forms.DateField(label="开始时间", widget=wid.DateInput(attrs={"class": "form-control", 'type': "date"}))
    it_end_time = forms.DateField(label="结束时间", widget=wid.DateInput(attrs={"class": "form-control", 'type': "date"}))
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            if name in self.bootstrapClass_filter:
                continue
            old_class = field.widget.attrs.get('class', "")
            field.widget.attrs['class'] = '{} form-control'.format(old_class)
            field.widget.attrs['placeholder'] = '请输入%s' % (field.label,)
View Code

 

法2

from django.forms import ModelForm
from django import forms
from django.forms import widgets as wid
from app01 import models
​
class ItModelForm(ModelForm):
    class Meta:
        model = models.It
        fields = "__all__"
        # 法2
        labels = {
            "it_name": "项目名称",
            "it_desc": "项目描述",
            "it_start_tile": "项目开始时间",
            "it_end_tile": "项目结束时间",
        }
        error_messages = {
            "it_name": {"required": "不能为空"},
            "it_desc": {"required": "不能为空"},
            "it_start_tile": {"required": "不能为空"},
            "it_end_tile": {"required": "不能为空"},
        }
        widgets = {
            "it_name": wid.Input(attrs={"class": "form-control", "placeholder": "输入项目名称"}),
            "it_desc": wid.Textarea(attrs={"class": "form-control", "placeholder": "输入项目名称"}),
            "it_start_time": wid.DateInput(attrs={"class": "form-control", 'type': "date"}),
            "it_end_time": wid.DateInput(attrs={"class": "form-control", 'type': "date"}),
        }
View Code

 

templates模板

adminLTE是基于bootstrap3的前端框架,并且将bootstrap3进行修改来适应自身的样式。

adminLTE:

我们copy的是static/AdminLTE-master/starter.index 修改静态文件的引用方式

add_it.html:

{% extends 'base.html' %}
​
{% block breadcrumb %}
    <ol class="breadcrumb">
        <li class="breadcrumb-item"><a href="{% url 'index' %}">Index</a></li>
        <li class="breadcrumb-item">项目列表</li>
        <li class="breadcrumb-item">添加项目</li>
    </ol>
{% endblock %}
​
​
{% block content %}
{#    <div class="card-header">#}
{#        <h3>添加项目</h3>#}
{#    </div>#}
{#    <div class="card-body">#}
        <form action="" method="post" novalidate>
            {% csrf_token %}
            {% for foo in it_form_obj %}
​
                <div>
                    <label for="{{ foo.id_for_label }}">{{ foo.label }}</label>
                    {{ foo }}
                </div>
                <span style="color: red;">{{ foo.errors.0 }}</span>
            {% endfor %}
            <input type="submit" class="btn btn-success" value="提交">
        </form>
{#    </div>#}
​
​
​
​
{% endblock %}
View Code

 

edit_it.html:

{% extends 'base.html' %}
​
{% block breadcrumb %}
    <ol class="breadcrumb">
        <li class="breadcrumb-item"><a href="{% url 'index' %}">Index</a></li>
        <li class="breadcrumb-item">项目列表</li>
        <li class="breadcrumb-item">添加项目</li>
    </ol>
{% endblock %}
​
​
{% block content %}
{#    <div class="card-header">#}
{#        <h3>添加项目</h3>#}
{#    </div>#}
{#    <div class="card-body">#}
        <form action="" method="post" novalidate>
            {% csrf_token %}
            {% for foo in it_form_obj %}
​
                <div>
                    <label for="{{ foo.id_for_label }}">{{ foo.label }}</label>
                    {{ foo }}
                </div>
                <span style="color: red;">{{ foo.errors.0 }}</span>
            {% endfor %}
            <input type="submit" class="btn btn-success" value="提交">
        </form>
​
{#    </div>#}
​
​
​
​
​
{% endblock %}
​
​
View Code

 


index.html:

{% extends 'base.html' %}
​
{% block breadcrumb %}
    <ol class="breadcrumb">
        <li class="breadcrumb-item"><a href="{% url 'index' %}">Index</a></li>
        <li class="breadcrumb-item active">项目列表</li>
    </ol>
{% endblock %}
​
​
​
{% block content %}
    <div class="card card-primary card-outline">
        <div class="card-header">
            <a href="{% url 'add_it' %}">添加项目</a>
        </div>
    </div>
    {% if it_obj %}
        <div class="card card-primary">
            <div class="card-header">
            <a href="{% url 'add_it' %}">添加项目</a>
        </div>
            <table class="table table-striped table-hover table-bordered">
                    <thead>
                    <tr>
                        <th>序号</th>
                        <th>名称</th>
                        <th>描述</th>
                        <th>开始时间</th>
                        <th>结束时间</th>
                        <th>操作</th>
                    </tr>
                    </thead><tbody>
                    {% for foo in it_obj %}
                        <tr>
                            <td>{{ forloop.counter }}</td>
                            <td>{{ foo.it_name }}</td>
                            <td>{{ foo.it_desc }}</td>
                            <td>{{ foo.it_start_time }}</td>
                            <td>{{ foo.it_end_time }}</td>
                            <td>
                                <a href="{% url 'delete_it' foo.pk %}" class="btn btn-danger btn-sm">删除</a>
                                <a href="{% url 'edit_it' foo.pk %}" class="btn btn-info btn-sm">编辑</a>
                                <a href="" class="btn btn-warning btn-sm">添加用例</a>
                                <a href="" class="btn btn-success btn-sm">查看用例列表</a>
                            </td>
                        </tr>
                    {% endfor %}
​
                    </tbody>
            </table>
        </div>
    {% else %}
        没有数据,去 <a href="{% url 'add_it' %}">创建</a>
    {% endif %}
​
{% endblock %}
​
View Code

 


 
posted @ 2022-11-14 20:56  贰号猿  阅读(44)  评论(0)    收藏  举报