规范:编写一个名为“学习笔记”的Web应用程序,让用户能够记录感兴趣的主题,并在学习每个主题的过程中添加日志条目。“学习笔记”的主页对这个网站进行描述,并邀请用户注册或登录。用户登录后,就可创建新的主题、添加新条目以及阅读既有条目。
1.1 安装virtualenv
pip install virtualenv
1.2 搭建虚拟环境
F:\xiangmu>virtualenv env11
1.3 激活虚拟环境
env11\Scripts\activate
1.4 安装Django
pip install Django
1.5 创建项目
(env11) F:\xiangmu>django-admin startproject studylog .#不要忘记末尾的空格句点 该句点让新项目使用合适的目录结构
在这过程中遇到了不少麻烦,最终解决方法:设置默认py文件启动方式为python.exe;命令行输入pip install django(并非之前在虚拟环境);去掉django-admin后缀.py
1.6 创建数据库
python manage.py migrate
1.7 查看核实django项目
(env11) F:\xiangmu>python manage.py runserver#运行
Performing system checks...
System check identified no issues (0 silenced).#检查确认创建正确项目
September 19, 2018 - 07:22:23
Django version 2.1.1, using settings 'studylog.settings'
Starting development server at http://127.0.0.1:8000/#指出了项目的url
Quit the server with CTRL-BREAK.
在浏览器中输入http://127.0.0.1:8000/表示本地创建成功。
2.1 定义模型
(env11) F:\xiangmu>python manage.py startapp studylogs #不同于studylog,新文件,用于建立app所需的基本设施
(env11) F:\xiangmu>dir
驱动器 F 中的卷是 新加卷
卷的序列号是 66ED-CACB
F:\xiangmu 的目录
2018/09/19 周三 07:36 <DIR> .
2018/09/19 周三 07:36 <DIR> ..
2018/09/19 周三 07:15 131,072 db.sqlite3
2018/09/19 周三 05:28 <DIR> env11
2018/09/19 周三 07:06 555 manage.py #定义管理的数据
2018/09/19 周三 07:15 <DIR> studylog
2018/09/19 周三 07:36 <DIR> studylogs
# coding=utf-8
from django.db import models
#在这里创建模型,模型即是一个类
class Topic(models.Model):
'''用户学习的主题'''
text = models.CharField(max_length=200)#存储少量文本,200个字符的预留空间
date_added = models.DateTimeField(auto_now_add=True)#记录日期和时间的数据,并自动设置成当前日期和时间
def __str__(self):
'''返回模型的字符串表示'''
return self.text
2.2 激活模型
打开位于studylog中的settings.py文件,修改其部分,将之前的应用程序tian添加其中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'studylogs'#刚才修改的models.py所在的文件夹
]
需要让django修改数据库,使其能够存储与模型相关的信息
(env11) F:\xiangmu>python manage.py makemigrations studylogs#
Migrations for 'studylogs':
studylogs\migrations\0001_initial.py
- Create model Topic
(env11) F:\xiangmu>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, studylogs
Running migrations:
Applying studylogs.0001_initial... OK
(env11) F:\xiangmu>
每次需要修改管理的数据时,都有三个步骤:1.修改models.py 2.对studylogs调用makemigrations 3.让Django迁移项目
2.3 Django管理网站
①创建超级用户(管理员)
(env11) F:\xiangmu>python manage.py createsuperuser
Username (leave blank to use 'administrator'): admin
Email address: [email protected]
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: N
Password:
Password (again):
Superuser created successfully.
②向管理网站注册模型
打开studylogs下的admin.py,修改其数据
from django.contrib import admin
# Register your models here.
from studylogs.models import Topic#导入要注册的Topic类
admin.site.register(Topic)#让Django通过管理网站管理模型
③添加主题
在管理网站http://127.0.0.1:8000/admin/中add添加
2.4 定义模型Entry
需要为用户可在学习笔记中添加的条目定义模型,每个条目都与特定主题相关联,即多对一的关系。
class Entry(models.Model):
'''学到的有关某个主题的特定知识'''
topic = models.ForeignKey(Topic,on_delete=models.CASCADE)#foreignkey外键,引用数据库的另一条记录
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)#按创建顺序显示条目,并显示时间戳
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
return self.text[:50] + '...'
2.5 迁移模型Entry
(env11) F:\xiangmu>python manage.py makemigrations studylogs
Migrations for 'studylogs':
studylogs\migrations\0002_entry.py
- Create model Entry
(env11) F:\xiangmu>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, studylogs
Running migrations:
Applying studylogs.0002_entry... OK
2.6 向管理网站注册Entry
from django.contrib import admin
# Register your models here.
from studylogs.models import Topic,Entry
admin.site.register(Topic)
admin.site.register(Entry)
修改admin.py文件
2.7 django shell
django shell:通过交互式终端会话以编程方式查看数据,是测试项目和排除故障的理想之地。例如
(env11) F:\xiangmu>python manage.py shell
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from studylogs.models import Topic#这里导入模块studylogs中的模型topic
>>> Topic.objects.all()#返回一个列表,查询集
<QuerySet [<Topic: Chess>, <Topic: Game>]>
#可以进行遍历,查询id,通过id查看其属性
>>> topics = Topic.objects.all()
>>> for topic in topics:
... print(topic.id,topic)
...
1 Chess
2 Game
>>> t = Topic.objetcs.get(id=2)
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: type object 'Topic' has no attribute 'objetcs'
>>> t = Topic.objects.get(id=2)
File "<console>", line 1
t = Topic.objects.get(id=2)
^
IndentationError: unexpected indent
>>> t = Topic.objects.get(id=2)
>>> t.text
'Game'
>>> t.date_added
datetime.datetime(2018, 9, 19, 0, 33, 9, 870659, tzinfo=<UTC>)
ctrl+z退出shell
3.1 映射URL
打开studylog中的url.py:
from django.contrib import admin
from django.urls import path
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('studylogs.urls',namespace='studylogs')),
]
需要在studylogs中创建另一个urls.py文件:(难)
# coding=utf-8
'''定义studylogs的url模式'''
from django.urls import path
from . import views
app_name='studylogs'
urlpatterns = [
path('',views.index,name='index'),
]#URL模式三个实参 正则表达式 调用的视图函数将其命名为index
最后网站无法打开排查原因,出现在了这里,django2与django1在url上语法不同,1→2:urls→path,取消了之前的正则表达式url模式
3.2 编写视图
打开views.py
from django.shortcuts import render
# Create your views here.
def index(request)#主页
return render(request,'studylogs/index.html')
3.3 编写模板
在studylogs下新建一个templates(模板)文件夹,再在其中创建studylogs文件夹,在最新的studylogs文件夹中新建一个index.html的文件,并且修改:
<p>study log</p>
<p>i will remember the day i did this</p>
4.1 模板继承
创建父模板base.html
<p>
<a href="{% url 'studylogs:index' %}">studylog</a>
</p>
{% block content %}{% endblock content %}
修改子模板index.html
{% extends "studylogs/base.html"%}
{% block content %}
<p>i will remember the day i did this</p>
{% endblock content %}
4.2 url模式
修改studylogs下的urls.py
from django.urls import path
from . import views
app_name = 'studylogs'
urlpatterns = [
path('', views.index, name='index'),
path('topics/', views.topics, name='topics'),
]
修改views.py
from django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):
return render(request,'studylogs/index.html')
def topics(request):
topics = Topic.objects.order_by('date_added')#查询数据库,并按属性date排序,存储在topics中
context = {'topics':topics}#定义一个字典,将要发送给字典的上下文
return render(request,'studylogs/topics.html',context)
创建一个显示所有主题的模板,接受字典context
{% extends "studylogs/base.html"%}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>{{ topic }}</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}
修改父模板,使其包含到显示所有主题的页面的链接
<p>
<a href="{% url 'studylogs:index' %}">studylog</a> -
<a href="{% url 'studylogs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
4.3 显示特定主题的页面
urls.py
# coding=utf-8
'''定义studylogs的url模式'''
from django.urls import path,re_path
from . import views
app_name = 'studylogs'
urlpatterns = [
path('', views.index, name='index'),
re_path(r'^topics(?P<topic_id>\d+)/$', views.topics, name='topics'),
]
views.py
from django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):
return render(request,'studylogs/index.html')
def topics(request):
topics = Topic.objects.order_by('date_added')#查询数据库,并按属性date排序,存储在topics中
context = {'topics':topics}#定义一个字典,将要发送给字典的上下文
return render(request,'studylogs/topics.html',context)
def topic(request,topic_id):
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('date_added')
context = {'topic':topic,'entries':entries}
return render(request,'studylogs/topic.html',context)