一、app的组织
1.添加新的App
新建一个vedio的app,再在项目根目录下面建立了一个apps的文件夹,在pycharm中将vedio文件夹拖到apps下面,这样系统会自动在apps下面生成一个init文件。
2.Mark

这样就可以在pycharm中使用 from vedio import 导入了。但是执行代码的时候还是会报错。会出现找不到vedio的提示。
3.settings.py
import sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
二、模板文件
1.建立文件夹
在项目根目录建立一个templates文件夹,再新建一个vedio文件夹,将模板文件放到这个文件夹。
2.settings.py
'DIRS': [os.path.join(BASE_DIR, 'templates/')],
Referal:
http://www.xiucai.com/cooperation/
第三个app (PPT下载)
三、富文本编辑器django-ckeditor
1.安装
本来看DjangoUeditor的功能更多,可是看已经几年没有更新了,而且杨仕航的博客说他用起来一般,所以还是用django-ckeditor吧。安装并加入到settings.py中.
pip install django-ckeditor
INSTALLED_APPS = [
# ...
'ckeditor',
]
2.修改model
from ckeditor.fields import RichTextField content = RichTextField()
3.Migrage
python manage.py makemigrations ppt python manage.py migrate
4.在ppt下面的admin添加代码
from django.contrib import admin from .models import Ppt # Register your models here. admin.site.register(Ppt)
5.在后台就可以看到效果了。

四、添加图片上传功能
1.安装pillow,并注册上传文件路径
pip install pillow
INSTALLED_APPS = [
# ...
'ckeditor',
'ckeditor_uploader',
]
2.设置上传位置
修改settings.py
MEDIA_URL = '/media/'
# 放在django项目根目录,同时也需要创建media文件夹
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
CKEDITOR_UPLOAD_PATH = 'upload/'
3.配置上传url和media的访问
修改项目全局的urls.py
from django.conf import settings from django.conf.urls.static import static urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
4.修改Model
通过上面的设置,富文本编辑器可以添加图片,但只能添加引用图片,无法添加上传的图片。作如下修改:
from django.db import models
from ckeditor_uploader.fields import RichTextUploadingField
class Blog(models.Model):
title = models.CharField(max_length=50)
content = RichTextUploadingField()
5.解决错误
测试时出现:Image source URL is missing.的错误。
原来要点一下那个“send it to the server”才行。

这样就终于成功了。
6.如何在前端显示
在模板文件里的content文本前后增加两个标签即可实现,如:
<p>{% autoescape off %}{{ question.content }}{% endautoescape %}</p>
7.添加视频:
https://www.bilibili.com/video/av19154686/
四、添加计数器
1.添加字段
class Ppt(models.Model):
views = models.IntegerField(default=0)
#添加计数器方法
def viewed(self):
self.views += 1
self.save(update_fields=['views'])
然后执行make migration
2.Views
class PptDetailView(DetailView):
"""问题详情页"""
model = Ppt
context_object_name = 'question'
template_name = 'ppt/ppt_detail.html'
def get_object(self, queryset=None):
obj = super().get_object(queryset=queryset)
obj.viewed()
return obj
前端调用就不用说了,直接使用{{ question.views }}就可以了。
备注:
到这里这个APP就完成了,这个可以以后作为文章类的APP,有分类,有标签,有富文本编辑器。
五、解决migrate错误问题
由于添加了浏览量的字段,在执行migrate的时候,我选择了“2”,手动输入数据,结果报错了。记得以后不要选2了,要选1,直接在model的代码中设定default或者null=true.
最终的解决方案是:
1.将ppt下面migration下面的除__init__.py之外的所有0001,0002这样的文件删除。
2。在数据库中django_migrations表中将出问题的app相关的迁移记录都删掉
3.再执行migrate.
六、解决用户上传头像的功能
之前用户无法上传头像,通过打印from发现,用户头像还是没有发送:

七、数据采集
利用id,构建url,利用xpath获得回复。
/html/body/div[2]/div[1]/div/div[1]/div[2]/table/tbody/tr[6]/td/textarea
八、获取插入文章后的id
比如发表问题之后,需要马上得到这个问题的id,方便插入答案。
其实非常简单。
insertRes = Testlist.objects.create(*******) insertRes.id
可参考:
https://testerhome.com/topics/17507
九、注册
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
#用webdriver启动谷歌浏览器
print("启动浏览器,打开dede登录界面")
driver = webdriver.Chrome(executable_path='C:\\Users\\Kevin\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe')
driver.get('http://127.0.0.1:8000/accounts/signup/')
author = "mymali"
passowrd = "kevin1314"
#自动填入登录用户名
driver.find_element_by_xpath("//input[@name='username']").send_keys(author)
#自动填入登录密码
driver.find_element_by_xpath("./*//input[@name='password1']").send_keys(passowrd)
driver.find_element_by_xpath("./*//input[@name='password2']").send_keys(passowrd)
#自动点击登录按钮进行登录
driver.find_element_by_xpath("./*//button[@type='submit']").click()
print("注册成功")
time.sleep(2)
十、后续问题
网站部署到服务器上之后,发现访问首页与列表页非常慢。
1.分页
使用下面的新的代码:
{% if is_paginated %}
<nav aria-label="Score pagination" class="mb-4">
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.previous_page_number }}">上一页</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">上一页</span>
</li>
{% endif %}
<!--首页-->
{% if page_obj.number == 1 %}
<li class="page-item active">
<span class="page-link">
{{ page_obj.number }}
<span class="sr-only">(current)</span>
</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="?page=1">1</a>
</li>
{% endif %}
{% for page_num in paginator.page_range %}
{% if page_num != 1 and page_num != paginator.num_pages %}
{% if page_obj.number == page_num %}
<li class="page-item active">
<span class="page-link">
{{ page_num }}
<span class="sr-only">(current)</span>
</span>
</li>
<!--向前三页-->
{% elif page_obj.number|add:-3 == page_num %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% elif page_obj.number|add:-2 == page_num %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% elif page_obj.number|add:-1 == page_num %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
<!--向后三页-->
{% elif page_obj.number|add:3 == page_num %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% elif page_obj.number|add:2 == page_num %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% elif page_obj.number|add:1 == page_num %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% endif %}
{% endif %}
{% endfor %}
<!--最后一页-->
{% if page_obj.number == paginator.num_pages %}
<li class="page-item active">
<span class="page-link">
{{ paginator.num_pages }}
<span class="sr-only">(current)</span>
</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="?page={{ paginator.num_pages }}">{{ paginator.num_pages }}</a>
</li>
{% endif %}
{% if page_obj.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.next_page_number }}">下一页</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">下一页</span>
</li>
{% endif %}
</ul>
</nav>
{% endif %}
2.终于找到了原因
是下面这一行代码在作怪:
context["popular_tags"] = Question.objects.get_counted_tags() # 页面的标签功能
将这一行代码注释掉之后,网站速度飞快。