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
设置时区
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 admin使用
1.环境:python3.6+django2.0
2.xadmin下载: https://github.com/sshwsfc/xadmin/tree/django2(记得要直接下载zip)(如果报错 安装 xadmin-django)
########admin注册
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注册
from .models import *
import xadmin
class adminteacher(object):
list_per_page = 10
xadmin.site.register(teacher,adminteacher)
######
xadmin 定制
y①
②导出定制
③刷新定制
④显示列控制定制
⑤定义列名称
⑥django目录定制
⑦主题定制
from xadmin import views
class BaseSetting(object):
enable_themes = True use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)
⑧model 显示
⑨系统显示定制
⑨修改图标
类名称;‘图标样式’
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',
}
⑩单个字段xadmin配置,正常不需要配置要是配置得加,(逗号)
⑪设置只读字段
⑫django 获取主表对应的子表数量
获取老师下面学生的个数
获取学生对应的老师数量
文件上传下载1
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 内置上传代码
文件查看
代码统一提交到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默认没有增加read用户的权限,如何增加用户的 只读权限(view permission)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-admin-view-permission
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 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'
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>]