Django

创建env

我喜欢用Anaconda
conda create -n xxxx python=3.6+/2.7
创建了一个conda的自带环境
可以在Anconda中查看里面有啥
conda list查看所有的包
conda install xx 安装一个包
conda uninstall xx 卸载一个包
conda 存放在Anaconda/envs下
Linux: source (de)activate name(虚拟环境名称)
Windows: (de)activate name(虚拟环境名称)
Anaconda真的很良心不用自己解决包冲突该有的都有还能兼容pip一块用【爽到

环境搭建&创建工程

这里默认你已经配置好python环境了

    • 把django/bin/加入环境变量
    • cmd 中输入进入到想要工程文件夹(最好是空的),django-admin startproject name
    • 该目录下会多一个文件夹即是我们的工程.此时可以用pycharm打开配置一下django
      的configuration(最好单独创建一个conda env)


      选择配置好的conda环境

      配置configuration
    • 接下来就可以愉快的撸代码啦

django基本结构介绍

django灵活性比pyrimid稍微差一点,但是确实十分快速的一个框架,编写十分的快,虽然不如Flask小巧但是能承担很大的负载
django的基本过程

也是一个MVC但是简化了model的操作,直接用django的engine代替了sql语句,更好写,自带了admin以及升级之后炫酷的的xadmin。


在这里可以直接打开manage.py控制台

常用的命令:

#记不住也先看一遍,会一直用
django-admin startproject xxx#前面提到的开始一个django的项目cmd进入目录之后
startapp xxx#创建一个xxx的app
makemigrations#创建更改的makemigrations文件
migrate#应用你的更改到数据库
runserver 0.0.0.0:8000#在8000端口运行你的程序
flush#清空表
createsuperuser#创建管理员账户可以直接登陆后台,填入用户名密码邮箱可以空
dbshell#数据库命令行

新建一个工程之后

1-安装拓展包:
DjangoUeditor(源码安装)
xdamin(git源码安装)
django-cors-headers(解决跨域)
djangorestframework(RESTful框架)
mysql-client(windows 拓展站下载轮子)
django-filter
markdown
2- 建立目录


目录

3- 修改setting文件

sys.path.insert(0,BASE_DIR)
sys.path.inster(0,os.path.join(BASE_DIR,"apps"))
sys.path.inster(0,os.path.join(BASE_DIR,"extra_apps"))
#BASE_DIR下面增加这三条将BASE_DIR apps extra_apps添加进搜索路径去
INSTALLED_APPS = [
    .......
    "crispy_forms"
    "xadmin",
    "corsheaders"
]
#注册插件
MIDDLEWARE = [
    ......
    'corsheaders.middleware.CorsMiddleware',
    ......
]
#要放在django.middleware.common.CommonMiddleware之前,
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "blog",
        "USER":"root",
        "PASSWORD":"1118",
        "HOST":"127.0.0.1",
        "PORT":"3306"
    }
}
#修改默认数据库为Mysql
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'
...
USE_TZ = False
#修改时区

#下面是cors跨域配置
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
    '*'
)

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)

!数据库使用utf8_unicode 排序集使用utf8_general_ci django也是默认unicode,content_type='application/json[json类型才加,必需加]charset=utf-8'才可以返回中文
!AUTH_USER_MODEL = "app(AbstractUser使用者).UserProfile"继承AbstractUser时重复名字错误需要在setting中设置
!出现migrateerror把数据库全删除,重新migrate一遍
!开头标明#--coding:utf-8-*-,所有中文字符串前要有u

路由&中间件*

配置自定义500 404
关闭DEBUG模式无法访问static文件需要自己配置STATIC_ROOT
在全局url中handler404="users."

视图&url

URL:

from django.urls import include,path
include把app的urls包含进来
类视图在引入的时候,直接传入类的.as_view()方法

view:

view中处理Httprequest有函数视图和类视图
函数视图

def root_page(request):
    return HttpResponse("Hello world")

在url中引入

from .views import root_page
#your class here

urlpatterns=[
    path(r"",root_page),
]

类视图
类视图更加灵活,可以继承复用

from django.views.generic import View

class view_class(Viwe,):#注意此处是个元组
        def get(self,request,kw):#注意关键词的传入
                return HttpResponse ("hello world")
        def post(self,request):#post一般不需要kw,要对表单进行验证,用model中的form
                ```
                return  ...
#首先要在urls中引入
urlpatterns=[
    path(r"/view_calss",view_calss.as_view(),name="名字,在Django的templates中使用"),
]

留坑,modelfrom验证器,跟着DRF过一遍

Templates&staticflies

模型

字段类型

CharField
(max_length=n,default="默认值",primary_key=True/False,blank=True/False,
null=True/False,verbosename=u"管理界面中显示",unique=True/False)

EmailField(verbose_name=u"管理界面显示")

ImageField(upload_to="一个媒体文件夹",default="默认头像",max_length=100)
max_lengt=时路径最大长度

class Meta:

verbose_name="管理界面显示类的管理名称"
verbose_name_plural=verbose_name
db_table="自定义表名"
ordering="选取一个字段用来排序可用+/-"

def__str__(self):
     return self.管理中显示的字段


图片.png

查询模型:
查询方法
model.objects.filter()#过滤器
model.object.all()[0:x]#从0-x的切片,不支持负索引
model.objects.all().exists() #判断tb中是否为空
model.objects.all().count() #查询tb中的对象数量
model.objects.all().order_by('-name') #对tb中的对象按照name倒序查询
model.objects.all().reverse() #倒序取值,但需要已经在model中进行了排序,否则无意义。

过滤条件
条件选取querySet的时候,filter表示=,exclude表示!=。
querySet.distinct() 去重复
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',对sqlite,contains的效果等于icontains
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份

__day 日期字段的日
__isnull=True/False
__regex="^ $"正则

高级查询
from django.db.models import Q可以进行多连接查询筛选查询子句等
Q(OS_mark='wd') | Q(OS_mark='wa')可以和关键字混用但Q必须在前面

取回结果和操作
model.values()#返回字典组成的列表
model.values_list()#元组组成的列表没有键
model.values_list('name','ip')#只返回想要字段组成的元组的列表
item=model.objects.get(name='name')#查询出为name的结果一般返回单个
item.key=value#变更
item.save()#保存到数据库
item.delete()#删除记录
vm.objects.create(name='name',key='value')#创建新对象,调用save直接保存到数据库
vm.get_or_create(k="v")#返回一个二元组,若查询到了返回(结果,True)or(None,False)

QuerySet
查询出来的结果是一个QuerySet,是一个结果元组组成的列表
order_by("key")按照key进行排序,再进行reverse
可以切片不支持负索引,可调用reverse()将顺序倒过来
同一model和不同model都可以取并集

记得做缓存查询,避免重复

Xadmin

1-admin

在每个app下的admin中需要管理的类要引入并注册

from .models import UserProfile,Banner,EmailVerifyCode#引入类
# Register your models here.

class UserProfileAdmin(admin.ModelAdmin):#定义管理类
    pass
admin.site.register(UserProfile,UserProfileAdmin)#注册管理类

Xadmin

把git xadmin下的包xadmin放到extra_apps下

xadmin

xadmin需要"crispy_forms"注册进app中
使用xadmin的时候把原先的admin的操作注释,不再需要

url中引入xadmin

配置url

接下来访问admin就可以了


注册完毕的

外键字段要写成"foreign__keyword"会对外键的字段进行搜索

自定义界面和显示

修改adminx文件

from xadmin import views

#global seeting class
class BaseSetting(object):
    enable_themes=True
    #启用主题
    use_bootswatch=True
    #boots主题视图
#注册管理视图
xadmin.site.register(views.BaseAdminView,BaseSetting)
class GlobalSettings(object):
    site_title="年轻人的管理系统"
    #左上角的标志
    site_footer="我的论坛"
    #页脚显示
    menu_style="accordion"
    #折叠apps类
    model_icon = "fa fa-clone"
    #显示什么图标
    ordering=["index"]
    #按照index从小到大排序
    readonly_fields=["add_time",]
    #设置只读不可修改字段
    exclude=["add_time"]
    #不显示某些字段
#注册管理视图
xadmin.site.register(views.CommAdminView,GlobalSettings)

在app下的apps里添加命名verbose_name=u"自己定义的名称"
init.py里添加 default_app_config="users.apps.UserConfig"#app名称.apps.名称的Config
图标使用的是https://fontawesome.com/,下载4.7(xadmin暂时不支持5以上),解压css和font覆盖文件目录在'.\extra_apps\xadmin\static\xadmin\vendor\font-awesome'下
去这个网站找到对应版本的icon,想要哪个直接复制css给model_icon

图片.png

这个类在做外键的时候设置relfield_style="fk-ajax"即可在其它表中作为ajax和联想查询不再使用默认下拉式

嵌套管理

定义类

class BannerInline(object):
model=Banner#想要被嵌套的model
extra=0
#在管理class中注册
inlines=[BannerInline]#列表式的,可以有多个inline
字段分组管理

在model中创建新的类继承想要被管理的类


model

在xadmin中引入创建admin类重载queryset方法,绑定新的管理类


adminx

再重载queryset方法,会使符合条件的留下
其他几个小功能

--列表页直接编辑
list_editable=["字段名"]

--将函数直接作为字段,句柄传入字段列表将函数的返回值显示
可以直接在adminx中定义
定义描述和排序 function(函数句柄).short_description="xxx"后台显示名称就是自己定义的

--定时刷新
refresh_times=[3,2]
在配置了的Admin类中才会显示
会多出一个选项选择两秒或者三秒刷新一次

--外链接作为字段
在model中定义(不知道为什么不能跳转不过链接倒是个真链接 :\

def outer_connect(self):
    from django.utils.safestring import mark_safe
    return mark_safe("<a href='http://www.baidu.com'>跳转</a>")
outer_connect.short_description="后台字段名称"

http://47.101.52.166/blog/back/python/Django.html#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%92%8Cide

安装DjangoUeditor使用富文本

python3不能直接pip版本不兼容,去git把源码包下载回家
https://github.com/twz915/DjangoUeditor3/
解压之后命令行cd进目录激活虚拟环境,python setup.py install秒安完。
配置url:'ueditor/',include("DjangoUeditor.urls")'
使用from DjangoUeditor.models import UEditorField在model中引入
可以代替TextField不过需要额外配置参数我只列出常用的,它是继承自TextField的

Content=UEditorField(
verbose_name='内容',#别名
width=600, height=300,#编辑器宽高
imagePath="图片/ueditor/",
filePath="文件路径/ueditor/", #路径如果不加前面的' / '默认media_root为相对路径
defalut="",#默认为空migrate才不会出错)

导入xlsx json csv 插件的开发+外键自增似懂非懂留坑先填其他的 404 500 页面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容