​https://www.cnblogs.com/superhin/p/12176234.html​

​https://www.cnblogs.com/derek1184405959/category/1214771.html​

​https://www.cnblogs.com/derek1184405959/p/8733194.html​


simpleui  xadmin 引用editor编辑器

项目初始化流程(代码统一提交到github)

python  3.6.6

django  2.0.3

Django 创建项目总结_djangoDjango 创建项目总结_django_02Django 创建项目总结_django_03Django 创建项目总结_django_04Django 创建项目总结_django_05Django 创建项目总结_django_06Django 创建项目总结_django_07Django 创建项目总结_django_08Django 创建项目总结_django_09Django 创建项目总结_django_10Django 创建项目总结_django_11Django 创建项目总结_django_12Django 创建项目总结_django_13Django 创建项目总结_django_14Django 创建项目总结_django_15

Django 创建项目总结_django_16

Django 创建项目总结_django_17


设置时区

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False # 这里务必调整为False,否则时区设置无效


###################

static配置

STATIC_URL = '/static/'STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),)



Django 创建项目总结_django_18



Django 创建项目总结_django_19


Django 创建项目总结_django_20

Django 创建项目总结_django_21


Django 创建项目总结_django_22

Django 创建项目总结_django_23


Django admin使用

1.环境:python3.6+django2.0

2.xadmin下载: ​​https://github.com/sshwsfc/xadmin/tree/django2​​(记得要直接下载zip)(如果报错 安装 xadmin-django)

Django 创建项目总结_django_24

Django 创建项目总结_django_25

Django 创建项目总结_django_26

Django 创建项目总结_django_27

Django 创建项目总结_django_28

Django 创建项目总结_django_29


Django 创建项目总结_django_30

Django 创建项目总结_django_31Django 创建项目总结_django_32Django 创建项目总结_django_33


Django 创建项目总结_django_34



########admin注册

Django 创建项目总结_django_35

from django.contrib import admin
# Register your models here.from .models import *
import  xadmin
class adminteacher(admin.ModelAdmin):
list_per_page = 10
admin.site.register(teacher,adminteacher)


########xadmin注册

Django 创建项目总结_django_36

from .models import *

import  xadmin

class adminteacher(object):

   list_per_page = 10

xadmin.site.register(teacher,adminteacher)

Django 创建项目总结_django_37


######

xadmin 定制

y①

Django 创建项目总结_django_38

Django 创建项目总结_django_39


②导出定制

Django 创建项目总结_django_40


Django 创建项目总结_django_41

Django 创建项目总结_django_42

③刷新定制

Django 创建项目总结_django_43

Django 创建项目总结_django_44

④显示列控制定制

Django 创建项目总结_django_45

Django 创建项目总结_django_46

⑤定义列名称

Django 创建项目总结_django_47Django 创建项目总结_django_48

⑥django目录定制

Django 创建项目总结_django_49Django 创建项目总结_django_50Django 创建项目总结_django_51

⑦主题定制

from xadmin import views
class BaseSetting(object):
enable_themes = True    use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)

Django 创建项目总结_django_52Django 创建项目总结_django_53

⑧model 显示

Django 创建项目总结_django_54Django 创建项目总结_django_55Django 创建项目总结_django_56

⑨系统显示定制

Django 创建项目总结_django_57

Django 创建项目总结_django_58

Django 创建项目总结_django_59

⑨修改图标

类名称;‘图标样式’

global_models_icon = {
goodsType:'fa fa-adjust', goods:'fa fa-cloud', goodsComments:'fa fa-comments', customers:'fa fa-user', shoppingCart:'fa fa-shopping-cart', orders:'fa fa-info', orderInfos:'fa fa-info-circle',
}

Django 创建项目总结_django_60Django 创建项目总结_django_61

⑩单个字段xadmin配置,正常不需要配置要是配置得加,(逗号)

Django 创建项目总结_django_62

⑪设置只读字段

Django 创建项目总结_django_63Django 创建项目总结_django_64Django 创建项目总结_django_65Django 创建项目总结_django_66

⑫django 获取主表对应的子表数量 

获取老师下面学生的个数

Django 创建项目总结_django_67Django 创建项目总结_django_68

获取学生对应的老师数量

Django 创建项目总结_django_69Django 创建项目总结_django_70Django 创建项目总结_django_71

文件上传下载1

Django 创建项目总结_django_72Django 创建项目总结_django_73Django 创建项目总结_django_74Django 创建项目总结_django_75Django 创建项目总结_django_76Django 创建项目总结_django_77

def index(request):

   if request.method=="GET":

       return  render(request,'tfile/index.html')

   elif request.method=='POST':

       uname = request.POST.get('uname', '')

       photo = request.FILES.get('photo','')

       pname =  photo.name  #获取头像的名称

       ntime =  time.strftime("%Y%m%d%H%M%S")+"_"+pname  ##获取时间 然后拼接头像的名称 防止重复

       if not os.path.exists('media'):

           os.makedirs('media')

       with open(os.path.join(os.getcwd(),'media',ntime),'wb') as fss:

           for ck in photo.chunks():

               fss.write(ck)


       return  HttpResponse("hello")

   else:

       HttpResponse("访问量过大,请稍候重试。。。。")


<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/html">

   <head>

       <meta charset="UTF-8">

       <title>注册</title>

   </head>

   <body>

       <form method="post" action="register">

           {% csrf_token %}  {# 防止csrf(跨站请求伪造) #}

           <label>账号:</label>

           <input name="username">

           <div></div>

           <label>密码:</label>

           <input name="password"></br>

           <input type="submit" value="登录" />

           <input type="submit" value="注册" />

       </form>

   </body>

</html>

###

文件上传2

Django 创建项目总结_django_78Django 创建项目总结_django_79Django 创建项目总结_django_80Django 创建项目总结_django_81Django 创建项目总结_django_82Django 创建项目总结_django_83Django 创建项目总结_django_84

Django 创建项目总结_django_85



django 内置上传代码

Django 创建项目总结_django_86Django 创建项目总结_django_87Django 创建项目总结_django_88Django 创建项目总结_django_89Django 创建项目总结_django_90Django 创建项目总结_django_91

Django 创建项目总结_django_92

文件查看

Django 创建项目总结_django_93Django 创建项目总结_django_94Django 创建项目总结_django_95Django 创建项目总结_django_96Django 创建项目总结_django_97

Django 创建项目总结_django_98

Django 创建项目总结_django_99

Django 创建项目总结_django_100

Django 创建项目总结_django_101

Django 创建项目总结_django_102

代码统一提交到github

###################

django  类视图

前端:

indexd.html

<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <title>Title</title>

</head>

   <meta charset="utf-8">

<script src="/static/js/jquery.min.js"></script>

<body>

<div>

   <div>

       <button id="add"><span></span>新增</button>

       <p></p>

   </div>

   <div>

       <div>

           <input id="search" type="text">

           <span>

                   <button id="search_btn"   type="button">搜索</button>

               </span>

       </div>

   </div>

</div>


<div>

   <table id="idctable">

       <thead>

       <tr>

           <th>ID</th>

           <th>姓名</th>

           <th>身高</th>

           <th>年龄</th>

           <th>身份证号</th>

       </tr>

       </thead>

       <tbody id='table-content'>

       {% for obj in paginator_data.object_list %}

           <tr>

               <td><a href="/cmdb/mem/{{ obj.id }}">{{ obj.id }}</a></td>

               <td>{{ obj.name }}</td>

               <td>{{ obj.heigh }}</td>

               <td>{{ obj.age }}</td>

               <td>{{ obj.ucode }}</td>

           </tr>

       {% endfor %}

       </tbody>

   </table>

</div>


<div>

   {% if paginator_data.has_previous %}

       <a href='?page={{ paginator_data.previous_page_number }}&search={{ search }}'><span>上一页</span></a>

   {% endif %}


   {% for page in paginator_data.paginator.page_range %}

       {% if paginator_data.number == page %}

           <span id="currentpage">{{ page }}</span>

       {% else %}

           <a href='?page={{ page }}&search={{ search }}' title='{{ page }}'><span>{{ page }}</span></a>

       {% endif %}

   {% endfor %}


   {% if paginator_data.has_next %}

       <a href='?page={{ paginator_data.next_page_number }}&search={{ search }}'><span>下一页</span></a>

   {% endif %}

</div>


<script>

   $('#search_btn').click(function () {

       var search = $('#search').val()

       window.location.href = "/cmdb/mem/?search=" + search


   })


</script>

</body>

</html>


##indexd_detail.html

<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <title>Title</title>

</head>

   <meta charset="utf-8">

<script src="/static/js/jquery.min.js"></script>

<body>



<div>

   <table id="idctable">

       <thead>

       <tr>

           <th>ID</th>

           <th>姓名</th>

           <th>身高</th>

           <th>年龄</th>

           <th>身份证号</th>

       </tr>

       </thead>

       <tbody id='table-content'>


           <tr>

               <td>{{ id }}</td>

               <td>{{ name }}</td>

               <td>{{ heigh }}</td>

               <td>{{ age }}</td>

               <td>{{ ucode }}</td>

           </tr>

       </tbody>

   </table>

</div>

</body>

</html>


###后端views.py

# -*- coding: utf-8 -*-

from django.shortcuts import render


# Create your views here.

from   .models import  *

from django.http import JsonResponse, QueryDict

from functools import wraps

from django.views.generic import ListView

from django.db.models import Q

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


def handle_save_data(func):

   @wraps(func)

   def wrapper(*args,**kwargs):

       try:

           return func(*args, **kwargs)

       except Exception as e:

           print('---=== ', e)

           code = e.args[0]

           desc = e.args[1]

           if code == 1062:

               instance = '名称重复({})'.format(desc)

           return JsonResponse({'data': instance, 'status':0})

   return wrapper


class MemberView(ListView):

   model =  member

   paginate_by = 4

   template_name = 'cmdbt/indexed.html'

   template_detail = 'cmdbt/indexd_detail.html'

   def handle_page(self, page, object_list):

       paginator = Paginator(object_list, self.paginate_by, 1)

       try:

           paginator_data = paginator.page(page)

       except PageNotAnInteger:

           paginator_data = paginator.page(1)

       except EmptyPage:

           paginator_data = paginator.page(paginator.num_pages)

       return paginator_data

   ###查询搜索 首次加载

   def get_queryset(self):

       queryset = self.model.objects.all()

       search = self.request.GET.get('search')

       if search:

           queryset = queryset.filter(Q(name__contains=search) | Q(ucode__contains=search)|Q(heigh__contains=search)|Q(age__contains=search))

       qs = [i.to_dict for i in queryset]

       print(queryset)

       return queryset

   ##m默认加载

   def get(self, request, *args, **kwargs):

       pk = kwargs.get('pk')

       if pk:

           ###详情页

           try:

               instance = self.model.objects.get(pk=pk)

               return render(request, self.template_detail, instance.to_dict)

           except self.model.DoesNotExist:

               return JsonResponse({'data':'id {} not exits'.format(pk)})

           ##没有pk 获取所有 进行分页

       object_list = self.get_queryset()

       page = request.GET.get('page')

       paginator_data = self.handle_page(page, object_list)

       print(paginator_data)

       return render(request, self.template_name, {'paginator_data':paginator_data})

   ##创建操作

   @handle_save_data

   def post(self,request, *args, **kwargs):

       data = QueryDict(request.body).dict()

       instance = self.model.objects.create(**data)

       ##orm

       return JsonResponse({'data':instance.to_dict, 'status':1})

    ###更新操作

   @handle_save_data

   def put(self, request, *args, **kwargs):

       data = QueryDict(request.body).dict()

       pk = kwargs.get('pk')

       self.model.objects.filter(pk=pk).update(**data)

       return JsonResponse({'status':1})

   ###删除操作

   def delete(self, request, *args, **kwargs):

       pk = kwargs.get('pk')

       instance = self.model.objects.get(pk=pk)

       instance.delete()

       return JsonResponse({'status':1})



#####models.py

# -*- coding: utf-8 -*-

from django.db import models


##base 基类

class BaseModel(models.Model):

   '''

      基础表(抽象类)

   '''

   name = models.CharField(default='', null=True, blank=True, max_length=128, verbose_name='名字')

   create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

   update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')

   remark = models.TextField(default='', null=True, blank=True, verbose_name='备注')

   ###装饰器和字段一样返回,把数据转成字典返回

   @property

   def to_dict_base(self):

       ret = dict()

       for attr in [f.name for f in self._meta.fields]:

           value = getattr(self, attr)

           ret[attr] = value

       return ret


   def __unicode__(self):

       return self.name


   class Meta:

       abstract = True

       ordering = ['id']



##member类继承  BaseModel

class  member(BaseModel):

   ucode = models.CharField(default='', null=True, blank=True, max_length=128, verbose_name='身份证号')

   heigh =  models.CharField(default='', null=True, blank=True, max_length=128, verbose_name='身高')

   age  = models.CharField(default='', null=True, blank=True, max_length=128, verbose_name='年龄')

   ###身份证号不能重复,ucode作为唯一一条数据

   ##如果2个字段判断就unique_together = ('ucode',name)

   class Meta:

       unique_together = ('ucode',)


   @property

   def to_dict(self):

       ret = self.to_dict_base

       return  ret



#############urls.py

urlpatterns = [

   url(r'^mem/(?P<pk>\d+)?/?$', MemberView.as_view(), name='MemberView'),

]

Django 创建项目总结_django_103


Django默认没有增加read用户的权限,如何增加用户的 只读权限(view permission)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-admin-view-permission

Django 创建项目总结_django_104


INSTALLED_APPS = [

   'admin_view_permission',

   'simpleui',

   'django.contrib.admin',

   'django.contrib.auth',

   'django.contrib.contenttypes',

   'django.contrib.sessions',

   'django.contrib.messages',

   'django.contrib.staticfiles',

   'stu',

]

Django 创建项目总结_django_105



Django admin默认没有导出按钮(admin simpleui 都没有 只有xadmin有 ) 如下导出admin   simpleui都试用

class ExportExcelMixin(object):

   def export_as_excel(self, request, queryset):

       meta = self.model._meta

       field_names = [field.name for field in meta.fields]


       response = HttpResponse(content_type='application/msexcel')

       response['Content-Disposition'] = f'attachment; filename={meta}.xlsx'

       wb = Workbook()

       ws = wb.active

       ws.append(field_names)

       for obj in queryset:

           for field in field_names:

               data = [f'{getattr(obj, field)}' for field in field_names]

           row = ws.append(data)


       wb.save(response)

       return response


   export_as_excel.short_description = '导出Excel'

Django 创建项目总结_django_106

Django 创建项目总结_django_107

Django 创建项目总结_django_108

python的模型类导出(数据库设计字段声场models.py)  默认导出所有 只需要保留一部分自己需要的就可以了

python manage.py  inspectdb  >aliyun/models.py

###################################################################################################################################################


adminx.py代码


# Register your models here.

from .models import *

import  xadmin



class adminteacher(object):

   list_per_page = 5

  #fields = ('first_name', 'age')

   list_display = ('first_name', 'age')

   list_filter = ('first_name', 'age')

   search_fields = ('first_name', 'age')

   list_export = ('xls', 'xml', 'json')

   refresh_times = (3, 5)


xadmin.site.register(teacher,adminteacher)

from xadmin import views

class BaseSetting(object):

   enable_themes = True

   use_bootswatch = True


xadmin.site.register(views.BaseAdminView, BaseSetting)


class GlobalSettings(object):

   site_title = "老师管理系统"

   site_footer = '管理后台'

   menu_style = "accordion"  #选项卡折叠效果

    global_models_icon = {

       teacher: 'fa fa-comments'

   }


xadmin.site.register(views.CommAdminView, GlobalSettings)



###

models.py

from django.db import models


# Create your models here.


class teacher(models.Model):

   first_name = models.CharField(max_length=30,verbose_name="会员名")

   age = models.CharField(max_length=30,verbose_name="年龄")

   def __str__(self):

       return "%s" % (self.first_name)


   class Meta:

       verbose_name = u"老师"  # 这个名字是显示在xadmin后台左侧栏中

       verbose_name_plural = verbose_name


###

admin.py

from django.contrib import admin


# Register your models here.

from .models import *

import  xadmin


class adminteacher(admin.ModelAdmin):

   list_per_page = 10


admin.site.register(teacher,adminteacher)


###


data = [i for i in member.objects.all().values()]

print(data)

[{'id': 1, 'name': 'xiaoming', 'ucode': '12423', 'heigh': '235423525', 'age': '235', 'banjii_id': 1}, {'id': 2, 'name': '2353', 'ucode': '346346', 'heigh': '3463', 'age': '346', 'banjii_id': 1}, {'id': 3, 'name': '45645', 'ucode': '6456456', 'heigh': '4564', 'age': '565464', 'banjii_id': 1}, {'id': 4, 'name': '45645', 'ucode': '5464556568', 'heigh': '54645', 'age': '54654', 'banjii_id': 2}, {'id': 5, 'name': 'xiali', 'ucode': '', 'heigh': '', 'age': '18', 'banjii_id': 1}, {'id': 6, 'name': 'limimg', 'ucode': '345345', 'heigh': '', 'age': '', 'banjii_id': 2}]


data  =  [i for i in  member.objects.all().values('id','name')]

print(data)

[{'id': 1, 'name': 'xiaoming'}, {'id': 2, 'name': '2353'}, {'id': 3, 'name': '45645'}, {'id': 4, 'name': '45645'}, {'id': 5, 'name': 'xiali'}, {'id': 6, 'name': 'limimg'}]


data  =  [i for i in  member.objects.all()]

print(data)

[<member: xiaoming>, <member: 2353>, <member: 45645>, <member: 45645>, <member: xiali>, <member: limimg>]