法语学习网站 - 修建中 - 笔记
admin superuser: kate / 123
- 可以点击任何一句歌词,听到这句歌词的音频(Google cloud text to speech API)
- 为歌词做几个不同方面的统计,并将统计结果展示在这首歌的歌词页面上.
- 标注出学习重点:介词, 从句连接词, 否定形式动词
- 加入单词本功能。重点(from chat with ZWei):程序为用户整理单词本。把中文意思里有同样核心词的放一起,也就是形成了一个同义词的中译法/英词典。并且应让用户可以点击这个chunk,去查看这个chunk的来源歌曲。
- 在django installation复制创建virtual env的口令。
- cmd / cd / mkdir / django-admin startproject (project NAME)
- manage file directory: / Some useful hints for using the cd command:
- To navigate to your home directory, use "cd" or "cd ~"
- To navigate up one directory level, use "cd .."
- To navigate to the previous directory (or back), use "cd -"
- To navigate into the root directory, use "cd /"
- 之前输入过的指令:键盘的上下键
- 开始: python manage.py runserver 结束: ctrl+C
- 创建一个django app: python manage.py startapp NAME
- 新建new data base table:python manage.py makemigrations 然后 python manage.py migrate
- return render(request,'songs/index.html',context)
- return HttpResponseRedirect(reverse("indexofsongs:index"))
- 插入一个html到另一个里:
{%include '(文件夹名字)/navbar.html'%}
- 逻辑判断是使用: {% %}

- 使用static file。也是 {% %} 这个。看line1和line7。记得:这是写在<head></head>里。

- 使用for loop,也是用 {% %} 。 {% empty %} 是一个很好的django功能。

- 反复调用同一个html,也是用 {% %}。这个被叫做templates inheritance。


- 超链接到另一个url path (看第2图的line 9)。要在这个app的urls.py的urlpatterns上面去写一个:app_name = tasks (看第1图的line 5)。<a href="{% url 'songlyrics:thissong' %}"></a>


- 从页面获取用户的输入: <form action=" " method=" ">
这个环节要记得加入 {% csrf_token %},这是django自带的一个middleware。

- loop two lists: 需要现在views里使用python的zip(list1, list2).然后再在html templates里把他们逐一打开:


- 先写个死的,以此来确定views和html顺利链接上了,然后再去修改views,把数据库链接上。
- 创建一个文件夹,在这个文件夹里手动创建django的virtual env。然后在这个virtual env里pip install Django。§§§§§§§https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19760136#overview 我是直接在pycharm里创建了。估计老师是使用了免费版本pycharm所以要手动吧,不懂。
- 在pycharm里去查看目前这个项目的interpreter版本。方法是:到了pycharm的file的setting,里面可以找到这个新建的项目。在这个项目的文件夹里有一个叫project interpreter的。在这个interpreter页面上,上面最后边有一个小符号setting按钮,点击它。以后如果需要修改一个项目所使用的python版本,就是到这里来修改。还有啊,如果virtual env没有activated,那
- 这个django项目也是跑不起来的,这时候,也是到这里来,把设置里的env选择为之前自己手动创建的virtual env,这个设置修改后,要把项目重新开一次才会有效果。这个内容的讲解在10min30左右出现。§§§§§§§https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19760164#overview 我是在pycharm里直接创建我的项目的,创建的时候就已经把这个项目放入到了pycharm已经有的那个virtual env里,所以没有这些问题。但是,我现在要手动创建一次virtual env,因为不想把pycharm自带的virtual env里安装太多的package。但是我现在不想做这个事情,等修建下一个版本时来做。
- 执行了python manage.py migrate的指令,这就创建了data base tables。
- 新建一个django app:§§§§§§§https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19760332#overview 1.> 输入指令python manage.py startapp NAME。2.> 然后到setting.py找到INSTALLED APP,在这里添加上这个新建的app。3.> 这时候,需要重新python manage.py runserver。
- 为了能够使用django的admin系统,创建一个超级管理员: python manage.py createsuperuser
- 创建一个mytemplates的文件夹。这个里面是html静态文件,供不同django app 的html 都使用。因此,在这个mytemplate 文件夹里面,又会对应着各个django app有一模一样的名字,这样就可以每一个django app有自己的templates folder。1.> 这个mytemplates文件夹是创建在这个项目的文件夹里,也就是说它与各个app文件夹是平行/同级别关系。2.> 到setting.py文件里找到TEMPLATES= [ { } ]里的'DIRS:[ ]'。本来这个‘DIRS’:[ ] 里是空白的,要添加上地址,所以系统能够找到我自己创建的templates folder嘛。这个指令是:os.path.join(BASE_DIR, 'mytemplates')。§§§§§§§https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19760382#overview 不过,我使用的时候,django的项目里已经有了templates这个文件夹(虽然是空的),而且在setting.py文件里的设置也已经写好了,只是写的指令有一点不一样而已, 这么写的:'DIRS': [BASE_DIR / 'templates'] 。我觉得这或许是django升级了吧。§§§§§§§https://docs.djangoproject.com/en/3.1/howto/overriding-templates/
- 到views.py文件里去写def们。 def NAME(request): / context = {'key':'value'} / render(request, HTML_file name, context) §§§§§§§https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19760388#overview
- 到templates的文件夹里(这个文件夹在project level)去找到这个def所在的views.py所在的那个django app的名字。在这个django app的名字的文件夹里创建一个html文件。在这个文件里,编辑好这个页面要展示的内容。在动态内容的调取上,就使用def里这个context的key来提取。在这个视频的11min处:§§§§§§§https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19760388#overview
- 记得要在urls.py文件里去添加url。这个url其实就是网站地址。完全可以每一个def(view)有自己的url,每需要有一个时,在urls.py的文件里,写上一个新path,填入这个def的名字,就可以了。这个地址是在urlpatterns=[ ]去添加。有两个地方都要添加,其实。首先是project level的urls.py文件里

,第二是在每一个django app里的自己手动创建的一个urls.py文件里。

还有一种更高级的设置,是从url地址里抓取一个变量,然后把那个变量代入这个url地址对应的def里去,在def里,这个变量的值就可以被def使用了,然后产出想要的结果。这个高级玩法需要在两个地方去设置。首先是在app level的那个自己创建的urls.py文件里:

然后就是在同样的这个app里的views.py文件里去使用在url里抓取出来的这个变量:比如name。

11.到一个django app里去创建models。其实创建一个model就是在数据库里新增加一个table。具体看这里:https://docs.djangoproject.com/en/3.1/topics/db/models/ 所以,一个model新建后,要执行一个migrate的指令来把这个table在数据库里建立了:python manage.py makemigrations 然后就再 python manage.py migrate 这样就完成了。
创建了model后,记得写上def __str__(self):,这样子,在django admin的change page就可以方便查看所有数据条目了。

12. 对django自带的admin后台的设置进行各种修改。如果想在django自带的admin后台里操作这个新建的model的实际数据,就需要在一个叫做admin.py的文件里去register。1.>在这个model所处的这个django app里的admin.py文件里,先 from .models import modelNAME 2.> 写下admin.site.register(modelNAME) 然而,这样设置之后,在django自带的admin后台,内容查看是十分不方便的,因为每一条内容的名字就是这个model的名字后面加上一个递增的数字而已。所以,还需要进一步的设置,通过设置来改变admin后台显示的每一条数据的名字。那么,1.> 最简单的做法是回到这个model所在的models.py文件里,在这个model的下面增加一个def __str__(self): / return self.title,通过这个def来指出要在admin后台呈现的每一条数据的名称是这个title栏目里对应的值。2.> 复杂的做法是去呈现更多,而不仅仅只是title栏目对应的值。那么就要使用 ModelAdmin.list_display 的和 ModelAdmin.list_display_links 的相关功能了。查看https://docs.djangoproject.com/en/3.1/ref/contrib/admin/这个链接里的解释。如果看这个官方docs困难,就回看这个课程:https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19764770#overview 在这个课程的10min处,讲解了其他有用的设置:对数据库里的内容进行search和filter。

13. 设置一个static file的文件夹。这其实是有两个方面。第一个方面是整个网站里不同app都会同享的文件,比如在每个页面都会有的网站的logo。第二个方面是某一个model(数据库里的一张表)里每一条数据里的media文件。那这个static file的文件夹就要放在对应的那个app里。https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19764956#overview 在设置这个static file的时候,要去写指令的文件分别是:1.> setting.py里 2.> 在使用这个static file的html里 {% load static %} 3.> 这一步是对于某一个model里上传的media,具体指令在说明书的这个部分: Serving files uploaded by a user during development,指令是 + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 。这个指令是写在urls.py的文件里。在这个urls.py的文件里,记得import那两个需要import的,具体指令直接在说明书里去复制就可以。看官方的说明书,从 configuring static files开始看,说明书是1,2,3把上面说的步骤都写清楚了:https://docs.djangoproject.com/en/3.1/howto/static-files/

但是,说明书竟然没有写,其实还需要在setting.py的文件里增加一个media url的配置。 这里提到了让用户自己上传media,对系统安全是有威胁的,以后再来具体看。
14. 在views.py文件里,提取数据库里的数据,并传递到前面的html文件里。使用Django的ListView函数。https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19906032#notes 复制粘贴指令看Django的官方说明书的这里:https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-display/ 这种时候,urlpatterns的写法跟平时都不一样的,具体的看udemy这个课程的备注收藏夹https://www.udemy.com/course/django-30-masterclass-learn-how-to-create-django-apps/learn/lecture/19904454#notes 简单一句说,就是要使用as_view()这个函数。看项目FLV1的indexofsongs这个app里的第一个urlpattern,就是写的这种特殊urlpattern。
15.后台的第一批功能已经修建好了。see project FLV2_2_1。现在开始修建前端。
前端的一开始是:urls文件的设置和首页的配置。

16. 注册用户的功能
1.创建新的app叫做users

在总的urls里配置:

2. 创建一个py文件,命名为forms.py

3. views.py
success_url = '/'
(这个 '/' 是表示回到homepage)

4. urls.py

5. html:
{% csrf_token %}
{{form.as_p}}

{% csrf_token %} 要放在<form></form>的里面!

6. 处理用户输入有error的情况:

{{form.label}} 这个错了,应该是{{field.label}}

7. 登录和登出:
7.1 在settings.py配置:成功后转到homepage。当然也可以是其他的。'/' 表示homepage

7.2 在views.py里创建LoginView和LogoutView。他们两个指向的html是同一个!

7.3 创建login.html
首先,可以直接复制register.html,但是,不需要password2这一栏。粘贴过来后,做小修改:Register改为Login,记得修改<input>里面的value='login'。
第二,检查是否含有了{%include 'users/user_form_errors.html'%}
7.4 创建urls.py里的路径:

7.5 针对已经login的用户,还需要一个{% if %}来做条件判断。这个条件判断是出现在<form>之前的。因为,如果是已经login的用户,就不需要<form>了。
{% if not user.is_authenticated %}
执行login
{% else %}
一条信息展示给用户
{% endif %}


(下面这种用户创建真的难,之后的版本再来实践。之后当我需要把用户进行分类时再来。)
16.1 创建半自定义的用户账号:

这里的UserManger一个自创的class。具体情况见下面:
然而,在create_user这个步骤,完全没看懂。

把django自带的user model的表在数据库里删除,然后在settings.py添加如下设置:

在django admin页面去对user model进行常见的create, update,都需要配置了才能有。这些配置在admin.py进行。

16.2 在前端使用数据库里的用户表,完成用户注册等功能:
第一,在User app level创建一个form.py文件。在这个文件里,配置AccountRegisterForm:
这里有意思的地方是:
数据库表格Account里有一些attributes是Boolean值类型。这些类型在前端页面被做成了选项菜单,从而使得用户可以选择这些Boolean的值(数据库里的默认值是false)。

第二,在views.py文件里使用这个AccountRegisterForm:


第三,创建url路径
dapp_name = "users"

第四,创建html:
这里面的东西其实蛮多的。之后再来细看。特别是field.field.widget

16.3 把前端用户填写的信息放入后台数据库:
17. 创建paginator


18. 在一个页面上,通过同一个view,创建了两个传输数据的变量。第一个叫“jobs”,第二个叫"context"。这种情况我经常都会需要用到。

19. category是一个model,并且是blog model的Foreign Key。有意思的功能是:可以在category这个model里,写一个def去清点数数,count出有多少个blog是FK了这个category的。不过,要能实现这个count,有一个前提。这个前提就是:在blog model里,category FK这一个field的括号里,有写了related name = 'xxxx',比如这里的"jobs"。


然后,在html里使用的时候,是category加上这个def的名字:

于是,前端的页面就有了这样的结果!

其他必要补充学习:
1. Vue.js
https://www.又关.com/watch?v=bI5jpueiCWw
Why and How I Used Vue.js for My Python/Django Web App (and why not React)

1. text2speech (调用google的)
目前看到有两种途径实现。第一个是:

第二个是:Google Cloud Text-to-Speech AI API in Python - Creating a Python Program (Part 2)

2. 课程CS50里的一个django的课程。
帅哥老师讲得挺好。他会解释django功能的设计初衷,从而让人真正理解这个功能。比如,在django里,html文件和views文件的分割和轻而易举的链接,这个设计是因为在一个项目里,往往做前端和后端的人,是两组不同的人。这样的django设计就实现了允许这两组人同时开工且互不影响。另外,在method=GET/POST这个区别如何体现出来了when使用django的form功能,他算是我看到的第一个讲清楚了这一点的。

课程大纲:https://www.又关.com/watch?v=Uh85L0m0ags&t=2566s
1. urls.py。两种。一个是project level,一个是app level。两种之间要关联起来,是使用include( )来完成。
2. url path --> views.py里的某个def --> 这个def所return的那个html。这个过程。这个过程里有一个细节,<str : name>。这个细节是说,可以让views里的def去抓取url里的一个变量,并把这个变量放到这个def里去使用。
3.html文件。讲了好几个方面。有static/media/templates文件夹的设置,有html里使用逻辑判断的指令格式 {% endif %};有{% endfor%};有{% extends '..../... .html' %};有创建超链接,也就是从一个html页面链接到另一个path/html;有创建form来收获用户输入的数据(先是html里的传统方式,然后讲了django的form功能---在views文件里创建一个class,并且这个class是继承form.Form (视频的1hr21min);

在else的情况下,记得把用户填写了的form给返回去,而不是出一个新的空白表格。django会自动在页面上提示用户error是在哪里。
def add一开始就先判断method是否是POST。如果不是POST,那么else情况的method就是get。这个def add在method=GET的情况下,就是render了一个新的空白form给用户。
在html这里,还讲了redirect用户到另一个页面这个功能的搭建。使用了django.urls里的reverse( )这个函数,因此可以不写url path,而是写一个url path的name。当然,要写清楚是哪个app里的这个name。毕竟不用app里可能会有同样名字的。不写url path是因为老师说这个的名字在网站修建过程中,经常会被改动,那么当改动出现时,就会麻烦了,会脱节。

4. session这个概念。因为有session,所以可以很容易使得不同用户在同一个html上看到不同的内容。

3. 补充一下Django generic view
https://www.又关.com/watch?v=dHvcioGHg08

4. github的使用
https://www.又关.com/watch?v=MJUJ4wbFm_A 的 An Introduction to Git and GitHub by Brian Yu
1. 复制粘贴文件到本地:
2. 加入新的改变有三步, git add是第一步,第一步只是加上去而已, 并没有保存下来. 确定保存需要第二步,第二步是另一个指令: git commit -m "message"。第三步,这个保存还并没有到达github的repository里,这一步是git push来完成的。第一和第二步是可以使用一条指令来一步完成的,这条指令是 git commit -am "message"
3. 查看有哪些改变: git diff
4. 确定保存 git add上传的变化,并写一个message来给以后的自己看,以提示这一次改变的内容:
5. 把git add添加和git commit确认的添加保存到github上对应的repository里去:
6。 与git pull相对的是git pull,是从github repository里抓取版本到本地:
5.之后来选,在base.html的css文件里去换一个好玩的字体:

6. ListView的时候,调取url传输的values
https://www.又关.com/watch?v=5EfrKhdebKI
使用kwargs,把需要使用的values放入一个dict里传输到html上去:

7. Django Admin后台使用excel批量上傳數據:

8. Google cloud text to speech API
https://www.又关.com/watch?v=ZXnPMzmrmIY&t=641s

https://cloud.google.com/text-to-speech/docs/libraries#client-libraries-install-python
pip install --upgrade google-cloud-texttospeech
9. webiste audio player
https://hvitis.dev/how-to-code-simple-like-soundcloud-javascript-audio-player-with-django-tutorial


10. How to extract text from a PDF file using Python | Python Tutorial

11. Read from Excel files (.xlsx) using xlrd

..
-
Lisa叔叔 赞了这篇日记 2021-04-29 04:51:02