Open keyfall opened 5 years ago
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原理解析
响应请求
客户端打开网址,先进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
最后运行服务器,就好了
首先要创建用户名
python3 manage.py createsuperuser
然后输入用户名邮箱密码,就创建了
python3 manage.py startapp article
进入article文件夹里的models.py
这里是对应数据的
先在settings.py中把app放进安装程序的设置里
接着进行迁移,总共两步
python3 manage.py makemigrations
python3 manage.py migrate
在article文件夹的admin.py进行设置
最后运行服务器,显示 中文的话在settings.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
感觉写每步太费劲了,就写个自己能看懂的,讲个大概思路
主要流程就是上面的图,然后接着就是使用函数来实现功能
图中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就是每个模块(比如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,复杂了点,所以推荐用上面方法
article_list.html首先迭代articles,在页面显示title article_list.html中的a href里面的内容是跳到article_detail.html显示每个文章
视频看了80分钟,写了30分钟,继续!!!
主要是两部分修改,分别是article文件夹下的models.py和admin.py
def __str__(self):
return "<Article: %s>" % self.title
上面代码改成下面的样子,这个models.py主要是显示title的
@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就失效了
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
这里设置list_display,页面显示的属性
这里之前是Article.objects.all()显示全部的 现在使用Article.objects.filter(is_deleted=False) is_deleted就是article中的属性is_deleted =false就是一个条件,意思显示is_deleted=false的article,is_deleted=True的就不显示了
都改完了后就用一开始的命令进行更新数据库就行
在开发项目时,由于项目需要,安装一些工具包,但是安装后会放到同一个文件夹下,试想如果有两个项目都需要同一种工具包,但是不同版本,这样新的就会覆盖老的,那么之前的项目可能报错
安装virtualenv
pip install --user virtualenv
进行创建虚拟环境,激活,退出
创建
virtualenv mysite_env
激活(需要进入到mysite_env文件夹里)
这里是ubuntu的方法,windows的方法不同
source bin/activate
退出
deactivate
首先激活虚拟环境
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一键导出 把项目需要的包进行迁移
进行urls部署,views.py和对应html编辑
总urls.py
第一个path是首页,显示blog总目录 第二个path是后台管理 第三个path是调用blog文件夹中的urls,另外这些urls前缀加上blog/
第一个path是地址栏利用blog的id来进入对应的博客展示页 第二个path是地址栏利用blog的type来显示博客类型下的所有blog条目
blog_list是显示所有的条目,就是首页 blog_detail是显示blog详情页,这blog_pk是urls.py中对应的 blogs_with_type是blog_type对应下的所有blog
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.created_time|date:"Y-m-d H:n:s" 是时间自定义显示方式
新建一个base.html,把重复代码放进去,然后用block设置不同的地方
{% block title %}{% endblock %}
这样形式去定义各文件不同处
顶头是利用extends嵌入base.html下面是把内容添加到对应的首尾标签中就完成了
为了进行文件的规范管理,还有app中的模板是否是通用的,还是只针对本app进行的设置,如果通用就放在app的文件夹里,否则就放在全局模板文件夹里
利用os.path中的join方法合并字符串,从源地址到模板文件夹 这里把blog中的3个文件放到全局模板文件夹中的blog文件夹
然后修改views.py中设置html的位置 只需要前面加blog/ 因为流程是先从设置的Dirs中寻找地址,看看里面有没有对应的html,有就用,没有就到app文件夹对应的地方找,有就用,没有就报错
setting.py文件设置,html页面引用
利用load staticfiles进行static文件夹的定位,然后直接static ‘base.css’ 就可以引用
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:这就是要加载的内容
通过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栅栏和分页
urls.py views.py
这里把重复的内容给放到了函数def_blog_list_common_data(request,blog)中
blog_list.html的日期代码
blogs_with_date.html
展示
注册就是在setting.py中加入 配置model
图片上传 配置settings 这是上传的内容会放到media文件夹下的upload中,所以新建一个media文件夹,upload文件夹会自动创建
配置urls models.py也改变了
为了扩展性,所以把统计单独做一个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
pip,django安装
pip3更换镜像源 修改~/.pip/pip.conf文件, 没有则创建
现在装Django,由于我看的视频是2.0,所以就安装2.0了
pip install Django==2.0
如果报上面的错误,用下面的命令
pip install --user Django==2.0
然后安装好了,但是显示了一个警告 这个意思是没有添加Path,我先不管,有问题再考虑
升级pip
pip install -U pip
安装包
升级包
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