本項目使用的是AdminLTE 2.3.3javascript
請從下面路徑下載:路徑css
咱們把模板文件放到static目錄下面,而後咱們須要啥文件就把啥文件拉到template目錄下面(由於這樣代碼中的路徑就會自動改變),這裏咱們使用的是starter.html文件html
注意文件中的代碼路徑前端
把starter.html文件copy到新建文件base.url中修改html5
<!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> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>AdminLTE 2 | Starter</title> <!-- Tell the browser to be responsive to screen width --> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <!-- Bootstrap 3.3.6 --> <link rel="stylesheet" href="../static/AdminLTE-2.3.3/bootstrap/css/bootstrap.min.css"> <!-- Font Awesome --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css"> <!-- Ionicons --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css"> <!-- Theme style --> <link rel="stylesheet" href="../static/AdminLTE-2.3.3/dist/css/AdminLTE.min.css"> <!-- AdminLTE Skins. We have chosen the skin-blue for this starter page. However, you can choose any other skin. Make sure you apply the skin class to the body tag so the changes take effect. --> <link rel="stylesheet" href="../static/AdminLTE-2.3.3/dist/css/skins/skin-blue.min.css"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> </head> <!-- BODY TAG OPTIONS: ================= Apply one or more of the following classes to get the desired effect |---------------------------------------------------------| | SKINS | skin-blue | | | skin-black | | | skin-purple | | | skin-yellow | | | skin-red | | | skin-green | |---------------------------------------------------------| |LAYOUT OPTIONS | fixed | | | layout-boxed | | | layout-top-nav | | | sidebar-collapse | | | sidebar-mini | |---------------------------------------------------------| --> <body class="hold-transition skin-blue sidebar-mini"> <div class="wrapper"> <!-- Main Header --> <header class="main-header"> <!-- Logo --> <a href="../static/AdminLTE-2.3.3/index2.html" class="logo"> <!-- mini logo for sidebar mini 50x50 pixels --> <span class="logo-mini"><b>A</b>LT</span> <!-- logo for regular state and mobile devices --> <span class="logo-lg"><b>Admin</b>LTE</span> </a> <!-- Header Navbar --> <nav class="navbar navbar-static-top" role="navigation"> <!-- Sidebar toggle button--> <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> <span class="sr-only">Toggle navigation</span> </a> <!-- Navbar Right Menu --> <div class="navbar-custom-menu"> <ul class="nav navbar-nav"> <!-- Messages: style can be found in dropdown.less--> <li class="dropdown messages-menu"> <!-- Menu toggle button --> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-envelope-o"></i> <span class="label label-success">4</span> </a> <ul class="dropdown-menu"> <li class="header">You have 4 messages</li> <li> <!-- inner menu: contains the messages --> <ul class="menu"> <li><!-- start message --> <a href="#"> <div class="pull-left"> <!-- User Image --> <img src="../static/AdminLTE-2.3.3/dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> </div> <!-- Message title and timestamp --> <h4> Support Team <small><i class="fa fa-clock-o"></i> 5 mins</small> </h4> <!-- The message --> <p>Why not buy a new awesome theme?</p> </a> </li> <!-- end message --> </ul> <!-- /.menu --> </li> <li class="footer"><a href="#">See All Messages</a></li> </ul> </li> <!-- /.messages-menu --> <!-- Notifications Menu --> <li class="dropdown notifications-menu"> <!-- Menu toggle button --> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-bell-o"></i> <span class="label label-warning">10</span> </a> <ul class="dropdown-menu"> <li class="header">You have 10 notifications</li> <li> <!-- Inner Menu: contains the notifications --> <ul class="menu"> <li><!-- start notification --> <a href="#"> <i class="fa fa-users text-aqua"></i> 5 new members joined today </a> </li> <!-- end notification --> </ul> </li> <li class="footer"><a href="#">View all</a></li> </ul> </li> <!-- Tasks Menu --> <li class="dropdown tasks-menu"> <!-- Menu Toggle Button --> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-flag-o"></i> <span class="label label-danger">9</span> </a> <ul class="dropdown-menu"> <li class="header">You have 9 tasks</li> <li> <!-- Inner menu: contains the tasks --> <ul class="menu"> <li><!-- Task item --> <a href="#"> <!-- Task title and progress text --> <h3> Design some buttons <small class="pull-right">20%</small> </h3> <!-- The progress bar --> <div class="progress xs"> <!-- Change the css width attribute to simulate progress --> <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> <span class="sr-only">20% Complete</span> </div> </div> </a> </li> <!-- end task item --> </ul> </li> <li class="footer"> <a href="#">View all tasks</a> </li> </ul> </li> <!-- User Account Menu --> <li class="dropdown user user-menu"> <!-- Menu Toggle Button --> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <!-- The user image in the navbar--> <img src="../static/AdminLTE-2.3.3/dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> <!-- hidden-xs hides the username on small devices so only the image appears. --> <span class="hidden-xs">Alexander Pierce</span> </a> <ul class="dropdown-menu"> <!-- The user image in the menu --> <li class="user-header"> <img src="../static/AdminLTE-2.3.3/dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> <p> Alexander Pierce - Web Developer <small>Member since Nov. 2012</small> </p> </li> <!-- Menu Body --> <li class="user-body"> <div class="row"> <div class="col-xs-4 text-center"> <a href="#">Followers</a> </div> <div class="col-xs-4 text-center"> <a href="#">Sales</a> </div> <div class="col-xs-4 text-center"> <a href="#">Friends</a> </div> </div> <!-- /.row --> </li> <!-- Menu Footer--> <li class="user-footer"> <div class="pull-left"> <a href="#" class="btn btn-default btn-flat">Profile</a> </div> <div class="pull-right"> <a href="#" class="btn btn-default btn-flat">Sign out</a> </div> </li> </ul> </li> <!-- Control Sidebar Toggle Button --> <li> <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> </li> </ul> </div> </nav> </header> <!-- Left side column. contains the logo and sidebar --> <aside class="main-sidebar"> <!-- sidebar: style can be found in sidebar.less --> <section class="sidebar"> <!-- Sidebar user panel (optional) --> <div class="user-panel"> <div class="pull-left image"> <img src="../static/AdminLTE-2.3.3/dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> </div> <div class="pull-left info"> <p>Alexander Pierce</p> <!-- Status --> <a href="#"><i class="fa fa-circle text-success"></i> Online</a> </div> </div> <!-- search form (Optional) --> <form action="#" method="get" class="sidebar-form"> <div class="input-group"> <input type="text" name="q" class="form-control" placeholder="Search..."> <span class="input-group-btn"> <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i> </button> </span> </div> </form> <!-- /.search form --> <!-- Sidebar Menu --> <ul class="sidebar-menu"> <li class="header">HEADER</li> <!-- Optionally, you can add icons to the links --> <li class="active"><a href="#"><i class="fa fa-link"></i> <span>Link</span></a></li> <li><a href="#"><i class="fa fa-link"></i> <span>Another Link</span></a></li> <li class="treeview"> <a href="#"><i class="fa fa-link"></i> <span>Multilevel</span> <i class="fa fa-angle-left pull-right"></i></a> <ul class="treeview-menu"> <li><a href="#">Link in level 2</a></li> <li><a href="#">Link in level 2</a></li> </ul> </li> </ul> <!-- /.sidebar-menu --> </section> <!-- /.sidebar --> </aside> <!-- Content Wrapper. Contains page content --> {% block content %} <div class="content-wrapper"> <!-- Content Header (Page header) --> <section class="content-header"> <h1> Page Header <small>Optional description</small> </h1> <ol class="breadcrumb"> <li><a href="#"><i class="fa fa-dashboard"></i> Level</a></li> <li class="active">Here</li> </ol> </section> <!-- Main content --> <section class="content"> <!-- Your Page Content Here --> </section> <!-- /.content --> </div> {% endblock %} <!-- /.content-wrapper --> <!-- Main Footer --> <footer class="main-footer"> <!-- To the right --> <div class="pull-right hidden-xs"> Anything you want </div> <!-- Default to the left --> <strong>Copyright © 2015 <a href="#">Company</a>.</strong> All rights reserved. </footer> <!-- Control Sidebar --> <aside class="control-sidebar control-sidebar-dark"> <!-- Create the tabs --> <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> <li class="active"><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> </ul> <!-- Tab panes --> <div class="tab-content"> <!-- Home tab content --> <div class="tab-pane active" id="control-sidebar-home-tab"> <h3 class="control-sidebar-heading">Recent Activity</h3> <ul class="control-sidebar-menu"> <li> <a href="javascript:;"> <i class="menu-icon fa fa-birthday-cake bg-red"></i> <div class="menu-info"> <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> <p>Will be 23 on April 24th</p> </div> </a> </li> </ul> <!-- /.control-sidebar-menu --> <h3 class="control-sidebar-heading">Tasks Progress</h3> <ul class="control-sidebar-menu"> <li> <a href="javascript:;"> <h4 class="control-sidebar-subheading"> Custom Template Design <span class="label label-danger pull-right">70%</span> </h4> <div class="progress progress-xxs"> <div class="progress-bar progress-bar-danger" style="width: 70%"></div> </div> </a> </li> </ul> <!-- /.control-sidebar-menu --> </div> <!-- /.tab-pane --> <!-- Stats tab content --> <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div> <!-- /.tab-pane --> <!-- Settings tab content --> <div class="tab-pane" id="control-sidebar-settings-tab"> <form method="post"> <h3 class="control-sidebar-heading">General Settings</h3> <div class="form-group"> <label class="control-sidebar-subheading"> Report panel usage <input type="checkbox" class="pull-right" checked> </label> <p> Some information about this general settings option </p> </div> <!-- /.form-group --> </form> </div> <!-- /.tab-pane --> </div> </aside> <!-- /.control-sidebar --> <!-- Add the sidebar's background. This div must be placed immediately after the control sidebar --> <div class="control-sidebar-bg"></div> </div> <!-- ./wrapper --> <!-- REQUIRED JS SCRIPTS --> <!-- jQuery 2.2.0 --> <script src="../static/AdminLTE-2.3.3/plugins/jQuery/jQuery-2.2.0.min.js"></script> <!-- Bootstrap 3.3.6 --> <script src="../static/AdminLTE-2.3.3/bootstrap/js/bootstrap.min.js"></script> <!-- AdminLTE App --> <script src="../static/AdminLTE-2.3.3/dist/js/app.min.js"></script> <!-- Optionally, you can add Slimscroll and FastClick plugins. Both of these plugins are recommended to enhance the user experience. Slimscroll is required when using the fixed layout. --> </body> </html>
pip3 install multiselectfieldjava
from django.db import models # Create your models here. from django.contrib.auth.models import AbstractUser from django.contrib import auth from django.core.exceptions import PermissionDenied from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, User from django.utils.translation import ugettext_lazy as _ from multiselectfield import MultiSelectField from django.utils.safestring import mark_safe course_choices = (('LinuxL', 'Linux中高級'), ('PythonFullStack', 'Python高級全棧開發'),) class_type_choices = (('fulltime', '脫產班',), ('online', '網絡班'), ('weekend', '週末班',),) source_type = (('qq', "qq羣"), ('referral', "內部轉介紹"), ('website', "官方網站"), ('baidu_ads', "百度推廣"), ('office_direct', "直接上門"), ('WoM', "口碑"), ('public_class', "公開課"), ('website_luffy', "路飛官網"), ('others', "其它"),) enroll_status_choices = (('signed', "已報名"), ('unregistered', "未報名"), ('studying', '學習中'), ('paid_in_full', "學費已交齊")) seek_status_choices = (('A', '近期無報名計劃'), ('B', '1個月內報名'), ('C', '2周內報名'), ('D', '1周內報名'), ('E', '定金'), ('F', '到班'), ('G', '全款'), ('H', '無效'),) pay_type_choices = (('deposit', "訂金/報名費"), ('tuition', "學費"), ('transfer', "轉班"), ('dropout', "退學"), ('refund', "退款"),) attendance_choices = (('checked', "已簽到"), ('vacate', "請假"), ('late', "遲到"), ('absence', "缺勤"), ('leave_early', "早退"),) score_choices = ((100, 'A+'), (90, 'A'), (85, 'B+'), (80, 'B'), (70, 'B-'), (60, 'C+'), (50, 'C'), (40, 'C-'), (0, ' D'), (-1, 'N/A'), (-100, 'COPY'), (-1000, 'FAIL'),) class UserInfo(AbstractUser): tel=models.CharField(max_length=32,null=True,blank=True) gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1) class Customer(models.Model): """ 客戶表 """ qq = models.CharField('QQ', max_length=64, unique=True, help_text='QQ號必須惟一') qq_name = models.CharField('QQ暱稱', max_length=64, blank=True, null=True) name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='學員報名後,請改成真實姓名') sex_type = (('male', '男'), ('female', '女')) sex = models.CharField("性別", choices=sex_type, max_length=16, default='male', blank=True, null=True) birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True) phone = models.BigIntegerField('手機號', blank=True, null=True) source = models.CharField('客戶來源', max_length=64, choices=source_type, default='qq') introduce_from = models.ForeignKey('Customer', verbose_name="轉介紹自學員", blank=True, null=True,on_delete=models.CASCADE) course = MultiSelectField("諮詢課程", choices=course_choices) class_type = models.CharField("班級類型", max_length=64, choices=class_type_choices, default='fulltime') customer_note = models.TextField("客戶備註", blank=True, null=True, ) status = models.CharField("狀態", choices=enroll_status_choices, max_length=64, default="unregistered", help_text="選擇客戶此時的狀態") date = models.DateTimeField("諮詢日期", auto_now_add=True) last_consult_date = models.DateField("最後跟進日期", auto_now_add=True) next_date = models.DateField("預計再次跟進時間", blank=True, null=True) consultant = models.ForeignKey('UserInfo', verbose_name="銷售", related_name='customers', blank=True, null=True,on_delete=models.CASCADE ) class_list = models.ManyToManyField('ClassList', verbose_name="已報班級", ) def __str__(self): return self.name+":"+self.qq def get_classlist(self): l=[] for cls in self.class_list.all(): l.append(str(cls)) return mark_safe(",".join(l)) class Campuses(models.Model): """ 校區表 """ name = models.CharField(verbose_name='校區', max_length=64) address = models.CharField(verbose_name='詳細地址', max_length=512, blank=True, null=True) def __str__(self): return self.name class ClassList(models.Model): """ 班級表 """ course = models.CharField("課程名稱", max_length=64, choices=course_choices) semester = models.IntegerField("學期") campuses = models.ForeignKey('Campuses', verbose_name="校區",on_delete=models.CASCADE) price = models.IntegerField("學費", default=10000) memo = models.CharField('說明', blank=True, null=True, max_length=100) start_date = models.DateField("開班日期") graduate_date = models.DateField("結業日期", blank=True, null=True) #contract = models.ForeignKey('ContractTemplate', verbose_name="選擇合同模版", blank=True, null=True,on_delete=models.CASCADE) teachers = models.ManyToManyField('UserInfo', verbose_name="老師") class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name='班額及類型', blank=True, null=True) class Meta: unique_together = ("course", "semester", 'campuses') def __str__(self): return "{}{}({})".format(self.get_course_display(), self.semester, self.campuses) ############################################################# # class ContractTemplate(models.Model): # """ # 合同模板表 # """ # name = models.CharField("合同名稱", max_length=128, unique=True) # content = models.TextField("合同內容") # date = models.DateField(auto_now=True) # # # class ConsultRecord(models.Model): # """ # 跟進記錄表 # """ # customer = models.ForeignKey('Customer', verbose_name="所諮詢客戶") # note = models.TextField(verbose_name="跟進內容...") # status = models.CharField("跟進狀態", max_length=8, choices=seek_status_choices, help_text="選擇客戶此時的狀態") # consultant = models.ForeignKey("UserProfile", verbose_name="跟進人", related_name='records') # date = models.DateTimeField("跟進日期", auto_now_add=True) # delete_status = models.BooleanField(verbose_name='刪除狀態', default=False) # # # class Enrollment(models.Model): # """ # 報名表 # """ # # why_us = models.TextField("爲何報名", max_length=1024, default=None, blank=True, null=True) # your_expectation = models.TextField("學完想達到的具體指望", max_length=1024, blank=True, null=True) # contract_agreed = models.BooleanField("我已認真閱讀完培訓協議並贊成所有協議內容", default=False) # contract_approved = models.BooleanField("審批經過", help_text="在審閱完學員的資料無誤後勾選此項,合同即生效", default=False) # enrolled_date = models.DateTimeField(auto_now_add=True, verbose_name="報名日期") # memo = models.TextField('備註', blank=True, null=True) # delete_status = models.BooleanField(verbose_name='刪除狀態', default=False) # customer = models.ForeignKey('Customer', verbose_name='客戶名稱') # school = models.ForeignKey('Campuses') # enrolment_class = models.ForeignKey("ClassList", verbose_name="所報班級") # # class Meta: # unique_together = ('enrolment_class', 'customer') # # # class PaymentRecord(models.Model): # """ # 繳費記錄表 # """ # pay_type = models.CharField("費用類型", choices=pay_type_choices, max_length=64, default="deposit") # paid_fee = models.IntegerField("費用數額", default=0) # note = models.TextField("備註", blank=True, null=True) # date = models.DateTimeField("交款日期", auto_now_add=True) # course = models.CharField("課程名", choices=course_choices, max_length=64, blank=True, null=True, default='N/A') # class_type = models.CharField("班級類型", choices=class_type_choices, max_length=64, blank=True, null=True, # default='N/A') # enrolment_class = models.ForeignKey('ClassList', verbose_name='所報班級', blank=True, null=True) # customer = models.ForeignKey('Customer', verbose_name="客戶") # consultant = models.ForeignKey('UserProfile', verbose_name="銷售") # delete_status = models.BooleanField(verbose_name='刪除狀態', default=False) # # status_choices = ( # (1, '未審覈'), # (2, '已審覈'), # ) # status = models.IntegerField(verbose_name='審覈', default=1, choices=status_choices) # # confirm_date = models.DateTimeField(verbose_name="確認日期", null=True, blank=True) # confirm_user = models.ForeignKey(verbose_name="確認人", to='UserProfile', related_name='confirms', null=True, # blank=True) # # # class CourseRecord(models.Model): # """課程記錄表""" # day_num = models.IntegerField("節次", help_text="此處填寫第幾節課或第幾天課程...,必須爲數字") # date = models.DateField(auto_now_add=True, verbose_name="上課日期") # course_title = models.CharField('本節課程標題', max_length=64, blank=True, null=True) # course_memo = models.TextField('本節課程內容', max_length=300, blank=True, null=True) # has_homework = models.BooleanField(default=True, verbose_name="本節有做業") # homework_title = models.CharField('本節做業標題', max_length=64, blank=True, null=True) # homework_memo = models.TextField('做業描述', max_length=500, blank=True, null=True) # scoring_point = models.TextField('得分點', max_length=300, blank=True, null=True) # re_class = models.ForeignKey('ClassList', verbose_name="班級") # teacher = models.ForeignKey('UserProfile', verbose_name="講師") # # class Meta: # unique_together = ('re_class', 'day_num') # # # class StudyRecord(models.Model): # """ # 學習記錄 # """ # # attendance = models.CharField("考勤", choices=attendance_choices, default="checked", max_length=64) # score = models.IntegerField("本節成績", choices=score_choices, default=-1) # homework_note = models.CharField(max_length=255, verbose_name='做業批語', blank=True, null=True) # date = models.DateTimeField(auto_now_add=True) # note = models.CharField("備註", max_length=255, blank=True, null=True) # homework = models.FileField(verbose_name='做業文件', blank=True, null=True, default=None) # course_record = models.ForeignKey('CourseRecord', verbose_name="某節課程") # student = models.ForeignKey('Customer', verbose_name="學員") # # class Meta: # unique_together = ('course_record', 'student')
暫時使用此表,有些表沒有使用。git
=====》數據庫遷移github
(1)自關聯表::一張表中本身關聯本身web
(2)ajax
MultiselectField 多選下拉框
TextField至關於數據庫中的text類型,存放的是打數據類型
4:往數據庫表中錄入數據
使用admin組件的方式錄入。請參考博文:Django--組件--admin組件的使用
url:
path('index/', views.index,name='index'),#index用戶管理首頁
view
def index(request): return render(request,'index.html')
index.html
{% extends "base.html" %}
效果:
正常顯示