项目准备
新建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 © 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
数据迁移:
python manage.py makemigrations python 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:
我们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
标签:index,项目表,name,form,django,obj,自动化,增删,import From: https://www.cnblogs.com/erhuoyuan/p/16890390.html