keyfall / xuexibiji

3 stars 0 forks source link

Django学习(包括pip安装) #14

Open keyfall opened 5 years ago

keyfall commented 5 years ago

pip,django安装

我的是ubuntu18.04

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 下载安装脚本
$ sudo python get-pip.py    # 运行安装脚本,这是python2的
$ sudo python3 get-pip.py  # 这是python3安装脚本,你想把pip关联到哪个,就用哪个安装脚本,现在一般是python3了

我用python3安装脚本,但是报错了 图片 上面最后一句显示没有模块“distutils.util” 所以安装下面就行: sudo apt-get install python3-distutils 中间会报错啥的,我也不懂,如果报错啥的就重新运行上面的命令 图片 这里就安装好了

pip3更换镜像源 修改~/.pip/pip.conf文件, 没有则创建

[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn

现在装Django,由于我看的视频是2.0,所以就安装2.0了 pip install Django==2.0

图片 如果报上面的错误,用下面的命令 pip install --user Django==2.0

然后安装好了,但是显示了一个警告 图片 这个意思是没有添加Path,我先不管,有问题再考虑

升级pip pip install -U pip

安装包

pip install Django             # 最新版本
pip install Django==1.0.4       # 指定版本
pip install 'Django>=1.0.4'     # 最小版本,这里有个引号

升级包 pip install --upgrade Django 升级指定的,通过使用==, >=, <=, >, < 来指定一个版本号

卸载包 pip uninstall Django

搜索包 pip search Django

显示安装包信息 pip show

查看指定包的详细信息 pip show -f Django

列出已安装的包 pip list

查看可升级的包 pip list -o

ubuntu进行ssh

sudo apt-get install openssh-server

keyfall commented 5 years ago

django创建第一个项目

django-admin startproject hello 这里又报错了,显示没有django-admin 我估计就是上面那个遗留问题,不过没关系,找到解决方法了 没有咱们就安装 sudo apt install python-django # 这里是我那里显示的,看你那里显示什么,你就安装什么 为了不继续报错,我就直接安装下一个了 sudo apt install python3-django 安装好后创建第一个项目 django-admin startproject hello 创建好了

然后讲解一下目录内容

  cd hello 
  tree

图片 图片

init.py 用于让外部文件导入时,知道这是一个可以导入的包,也就是说有了init.py,那么包中的内容都可以被import

然后输入以下命令打开服务器 python3 manage.py runserver 0.0.0.0:8000 0.0.0.0让其它电脑可连接到开发服务器,8000端口号 浏览器输入服务器ip及端口号,正常如下 图片

输入打开服务器的时候可能会报错(是啊,怎么老报错,B了狗了): 图片 大致意思是应用未迁移,运行下面命令来迁移 python3 manage.py migrate 因为我用的python3,所以这么写 然后就看见全是ok,很爽 再输入上面打开服务器的代码 ok了

补充

django中间件 django消息框架 django配置文件settings.py django 路由urls.py 从WSGI进行django原理解析

keyfall commented 5 years ago

helloworld

响应请求 图片

客户端打开网址,先进Urls,所以先写urls.py

图片

上面path('',view.index)这里两个参数,第一个里面是文件所在文件夹,比方域名是www.baidu.com,然后在里面加上admin/,那么服务器就会从www.baidu.com/admin/这个地方去找,不填就是同级文件中找 后面的view.index就是view.py文件中的函数(def) 上面的path('',view.index)可以写成re_path('^$',views) re_path()这个里面是正则表达式使用的,后面学了会写下来

view.py

图片

最后运行服务器,就好了

keyfall commented 5 years ago

后台管理

首先要创建用户名 python3 manage.py createsuperuser 然后输入用户名邮箱密码,就创建了

keyfall commented 5 years ago

模型创建

首先创建一个app

python3 manage.py startapp article

进入article文件夹里的models.py 图片

这里是对应数据的 图片

同步数据库

先在settings.py中把app放进安装程序的设置里 图片

接着进行迁移,总共两步 图片

python3 manage.py makemigrations
python3 manage.py migrate

在后台进行内容添加

在article文件夹的admin.py进行设置 图片

最后运行服务器,显示 图片 中文的话在settings.py文件中最后面改 图片

admin.py参数详解

django admin的模板地址:django/contrib/admin/templates/admin 重写admin模板方法 官网详细admin参数

# 在列表页显示的字段,默认会显示所有字段,有对应的方法可以重写
list_display = ('__str__',)
# 在列表页显示的字段中,可以链接到change_form页面的字段
list_display_links = ()
# 右侧的筛选,必须是字段,可以继承自SimpleListFilter来自定义筛选字段和规则,SimpleListFilter的方法在后面详细介绍
list_filter = ()
# 联表查询是否自动查询,可以是布尔,列表或元组,如果是列表或元组,则级联查询指定的字段
list_select_related = False
# 列表页每页展示的条数
list_per_page = 100
# 分页,显示全部,真是数据小于该值时才会显示全部
list_max_show_all = 200
# 在列表页可以编辑的字段
list_editable = ()
# 在列表页可以模糊搜索的字段
search_fields = ()
# 对Date和DateTime类型进行搜索
date_hierarchy = None
# 在change_form页面,按钮为,save按钮的值(save as new和save add another)
save_as = False
# 点击保存并继续编辑
save_as_continue = True
# save按钮的位置,是True则显示在页面上方
save_on_top = False
# 自定义分页类
paginator = Paginator
# 详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件管理员现在在创建,编辑或删除对象后保留列表视图中的过滤器。
# 可以将此属性设置为False,以恢复之前清除过滤器的行为。
preserve_filters = True
# 在详情页面,如果有FK到其他表,在详情页中可以动态的填加或删除级联数据
inlines = []
admin中action操作的设置
admin中的action是指在列表页的动作,默认为删除所选的条目,可以自定义填加动作,将动作注册到action中,需要是一个方法
# 定制action中的操作
actions = []
action_form = helpers.ActionForm
# action选项显示的位置,页面上方或者页面下方
actions_on_top = True
actions_on_bottom = False
# 是否显示action选择的个数
actions_selection_counter = True
checks_class = ModelAdminChecks
BaseModelAdmin中的属性
除了ModelAdmin中的属性,也可以自定义在其父类BaseModelAdmin中的属性和方法,是一些通用的,在继承子BaseModelAdmin的类中也可以完成的属性设置.一般是详情页的属性.
# 自动补全,外键查询数据多时,方便查找
autocomplete_fields = ()
# 详情页,针对外键和M2M字段变成input框形式
raw_id_fields = ()
# 详情页面展示的字段
fields = None
# 详情页面排除的字段,字段可以是数据库中的也可以是自定义的
exclude = None
# 在详情页面对数据进行分隔显示,对应到admin模板中的'fieldsets.html'
fieldsets = None
# 为详情页指定form表单,可以自定义显示的数据,字段
form = forms.ModelForm
# 下面两个是M2M显示时,数据移动选择.可以参考admin中用户的权限操作
filter_vertical = () # 纵向展示
filter_horizontal = () # 横向展示
# 详情页面使用radio显示选项,FK默认使用select
radio_fields = {}
# 填加页面,在某字段输入值后,自动填加到指定字段
# prepopulated_fields = {"email": ("user",)},email字段会在用户填加user字段时自动填充
prepopulated_fields = {}
# 详情页指定显示的插件,后面详细说明
formfield_overrides = {}
# 详情页面的只读字段
readonly_fields = ()
# 详情页面排序规则
ordering = None
# 禁止某些排序,为空则禁止所有的排序
sortable_by = None
# 编辑时是否在页面上显示view on set,可以通过方法来返回一个链接,后面说明
view_on_site = True
# 列表页,模糊搜索后面显示的数据个数样式
# 为True是显示条数,为False时显示全部
show_full_result_count = True
checks_class = BaseModelAdminChecks
keyfall commented 5 years ago

进行文章的显示

感觉写每步太费劲了,就写个自己能看懂的,讲个大概思路

图片

主要流程就是上面的图,然后接着就是使用函数来实现功能

urls

图中urls是进入总的urls,位置是:

图片

第一个hello是新建项目地址,然后第二个hello中的urls.py就是总的urls

图片

两个灰色是article文件夹中views内的函数地址,views是设置显示页面的地方 最后一个是设置article的所有url归article中的urs.py管(就是相当于总url根据功能进行的url再分配,为了防止总url过多,总不能文章的url和人员管理的url都放到总的url里,这不就太麻烦了) 上面两种方法都可以,后面方法更好

图片 这是article文件夹下的urls.py

views

里面的views就是每个模块(比如article)文件夹中的views.py了 图片

两个函数就是urls.py中添加的内容

article = Article.objects.get(id=article_id)                                                           
article = get_object_or_404(Article,pk=article_id) 

这两句其实意思一样,但是下面这句如果没有找到页面会抛出404,上面那句需要自己添加404,就是图片中被注释的try-except语句,不过自己添加404可以添加自己想要的内容,比如“此页面消失”之类的(用下面的语句添加失败页面我还没学呢,学到再加上)

然后context字典是因为render_to_response()需要 上面的是显示一篇文章,利用article = get_object_or_404(Article,pk=article_id)去查找article,放到字典里 下面的是 articles = Article.objects.all() 得到所有的article,但显示的会是地址,需要在html页面遍历 最后是

render_to_response("article_detail.html",context)   
render_to_response("article_list.html",context)      

这两句意思是跟服务器说我这里完成了,你去这里的html地址吧,另外把context传过去 其实还有一个语句是复杂点的 render(request,"article_detail.html",context) 这个多了request,复杂了点,所以推荐用上面方法

html

图片 图片

article_list.html首先迭代articles,在页面显示title article_list.html中的a href里面的内容是跳到article_detail.html显示每个文章

视频看了80分钟,写了30分钟,继续!!!

keyfall commented 5 years ago

admin定制

主要是两部分修改,分别是article文件夹下的models.py和admin.py

models.py

图片

def __str__(self):                                                                                    
      return "<Article: %s>" % self.title   

图片 上面代码改成下面的样子,这个models.py主要是显示title的

admin.py

图片

@admin.register(Article)                                                                                      
admin.site.register(ArticleArticleAdmin)

图片里的第4行和第9行是一个意思,就是把class的设置发布

class ArticleAdmin(admin.ModelAdmin):                                                                         
    list_display = ("id","title","content")                                                                   
    ordering = ("id",)                                                                                        

图片

list_display是显示什么内容 ordering是排序,这是升序,如果要降序就“-id”就好

如果使用了admin.py去设置,那么models.py就失效了

keyfall commented 5 years ago

修改模型需要更新数据库

图片

首先修改模型models.py

图片

created_time 是时间类型创造时间,auto_now_add=True意思是在创建时用当时的时间 last_updated_time是时间类型修改时间,auto_now=True是每次修改完就使用即时时间 这里的时间一般是早8个小时,用的UTC时间,改成中国时间就在setting.py里设置 TIME_ZONE =“utc”改为TIME_ZONG="Asia/Shanghai"就可以了

图片

author是作者,就是登录者,这里用了外键,跟User关联了,User就是上面setting.py中已经设置了的models,然后再在models.py中引用User,on_delete=models.DO_NOTHING是删了文章,作者不会被删除,default=1是默认值是1,可以写用户,但这里用户就是1,所以写1就好 is_deleted是布尔类型,默认是false readed_num是数值类型,默认是0

admin.py

图片 这里设置list_display,页面显示的属性

views.py

图片

这里之前是Article.objects.all()显示全部的 现在使用Article.objects.filter(is_deleted=False) is_deleted就是article中的属性is_deleted =false就是一个条件,意思显示is_deleted=false的article,is_deleted=True的就不显示了

都改完了后就用一开始的命令进行更新数据库就行

keyfall commented 5 years ago

构建个人博客网站

虚拟环境安装

在开发项目时,由于项目需要,安装一些工具包,但是安装后会放到同一个文件夹下,试想如果有两个项目都需要同一种工具包,但是不同版本,这样新的就会覆盖老的,那么之前的项目可能报错 安装virtualenv pip install --user virtualenv

进行创建虚拟环境,激活,退出 创建 virtualenv mysite_env 激活(需要进入到mysite_env文件夹里) 这里是ubuntu的方法,windows的方法不同 source bin/activate

退出 deactivate

keyfall commented 5 years ago

构建个人博客网站2

在虚拟环境创建

首先激活虚拟环境 source bin/activate 在mysite_env文件夹下进行创建项目和app django-admin startproject mysite python3 mysite/manage.py startapp blog

进行超级管路员的创建 因为是第一次进入,所以需要进行数据库更新,到mysite文件夹了 python3 manage.py migrate python3 manage.py createsuperuser 在setting.py中INSTALLED_APPS中加入‘blog’

然后models.py中写模块 models.py 图片

进行更新数据库 python3 manage.py makemigrations python3 manage.py migrate

admin.py设置显示 图片

最后拓展pip一键导出 图片 把项目需要的包进行迁移

keyfall commented 5 years ago

个人博客网站3

进行urls部署,views.py和对应html编辑

总urls.py

图片

第一个path是首页,显示blog总目录 第二个path是后台管理 第三个path是调用blog文件夹中的urls,另外这些urls前缀加上blog/

blog/urls.py

图片

第一个path是地址栏利用blog的id来进入对应的博客展示页 第二个path是地址栏利用blog的type来显示博客类型下的所有blog条目

views.py

图片

blog_list是显示所有的条目,就是首页 blog_detail是显示blog详情页,这blog_pk是urls.py中对应的 blogs_with_type是blog_type对应下的所有blog

blogs_with_type.html

图片

url 'home'这里的home对应总urls.py中的name="home" url 'blog_detail2' blog.pk 中的blog.pk是上面for blog in blogs里的blog blog.content | truncatechars:30 是表示截取前30个,超出就省略号 blogs|length是blogs的数量

blog_detail.html

图片

Blog.created_time|date:"Y-m-d H:n:s" 是时间自定义显示方式

blog_list.html

图片

keyfall commented 5 years ago

利用block和extend标签进行html的重复代码整合

新建一个base.html,把重复代码放进去,然后用block设置不同的地方

base.html

图片 {% block title %}{% endblock %}这样形式去定义各文件不同处

blog_detail.html

图片

顶头是利用extends嵌入base.html下面是把内容添加到对应的首尾标签中就完成了

keyfall commented 5 years ago

全局模板文件设置

为了进行文件的规范管理,还有app中的模板是否是通用的,还是只针对本app进行的设置,如果通用就放在app的文件夹里,否则就放在全局模板文件夹里

setting.py

图片

利用os.path中的join方法合并字符串,从源地址到模板文件夹 这里把blog中的3个文件放到全局模板文件夹中的blog文件夹 图片

然后修改views.py中设置html的位置 只需要前面加blog/ 因为流程是先从设置的Dirs中寻找地址,看看里面有没有对应的html,有就用,没有就到app文件夹对应的地方找,有就用,没有就报错

keyfall commented 5 years ago

静态文件引用

setting.py文件设置,html页面引用

setting.py

图片

base.html

图片 利用load staticfiles进行static文件夹的定位,然后直接static ‘base.css’ 就可以引用

keyfall commented 5 years ago

bootstrap使用

bootstrap下载

bootstrap下载地址 图片 解压压缩包,把文件夹放到static文件夹下面

导航栏

base.html 图片

在static/blog文件夹下的html中加以下代码 图片

在static/home.html中加以下代码 图片 主要是结合base.html对应地方加上active,功能是点击首页和博客的时候,相应的地方会变色

base.css 图片

导航条内容参照 图片

这要讲几个重点: 首先导入了js和css里面对应的文件,还导入了jquery.min.js文件 jquery.min.js文件地址

图片 1:navbar-fixed-top的意思是让这个div始终在页面顶端,比如一篇很长文章,往下拉但是页面顶端还是这个div 2:这个button是手机观看时由于宽度不够,所以会出现一个按钮,按按钮把对应的id为navbar-collapse的内容加载出来 3:这就是要加载的内容

图片 图片

keyfall commented 5 years ago

分页

通过bootstrap和django实现了分页和页面改进,内容有些多,就直接上代码了,要点分析一波 文件改动: 把blog文件夹(blog_list.html,blogs_with_type.html,blog_detail.html)移到blog/templates文件夹下了

views.py 图片 blog_list类添加了paginator,这是分页器 Paginator(blogs,10) 把blogs分为10个一页

其他的没什么,全是bootstrap栅栏和分页

keyfall commented 5 years ago

创建时间分类

urls.py 图片 views.py

图片

图片 这里把重复的内容给放到了函数def_blog_list_common_data(request,blog)中

blog_list.html的日期代码 图片

blogs_with_date.html 图片

展示 图片 图片

keyfall commented 5 years ago

安装django并实现图片上传

图片 注册就是在setting.py中加入 图片 配置model 图片

图片上传 图片 配置settings 图片 这是上传的内容会放到media文件夹下的upload中,所以新建一个media文件夹,upload文件夹会自动创建

配置urls 图片 models.py也改变了 图片

keyfall commented 5 years ago

进行博客阅读量设置

思路

为了扩展性,所以把统计单独做一个app,名称为read_statistics,然后博客调用 read_statistics下的文件 admin.py 图片

models.py 图片 上面的ReadNumExpandMethod方法,返回阅读量,令后台和前台读取,会在blog文件夹下的models.py中调用

utils.py 图片 这里是设置cookie,为了防止用刷新来增加阅读量

blog下的文件 views.py 图片 引入,检查cookie,设置key

models.py 图片 调用read_statistics文件夹下的models.py

admin.py 图片 后台显示阅读量

blog_detail.html 图片 models.py调用了read_statistics的models.py的ReadNumExpandMethod类,所以可以直接使用里面的方法,就是继承

blog_list.html 图片

keyfall commented 4 years ago

Ubuntu部署Django项目方法详解

keyfall commented 4 years ago

Django常用命令介绍

keyfall commented 4 years ago

ipython基本使用

keyfall commented 4 years ago

centos和ubuntu下redis的安装与使用 django身份认证 Django ORM常用操作介绍 virtualenv使用技巧大全,python新手必备知识 如何用正确的姿势去创建或者迁移Django数据库 django-import-export插件使用教程