Home >  > 网站开发(六)财务网开发之三(计数器)

网站开发(六)财务网开发之三(计数器)

0

一、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()  # 页面的标签功能

将这一行代码注释掉之后,网站速度飞快。

暧昧帖

本文暂无标签

发表评论

*

*