A、建立项目
一、建立虚拟环境
在项目的目录下创建一个虚拟环境
python - m venv ll_env |
二、激活虚拟环境
source ll_env / bin / active |
三、安装Django
pip install django |
注意:django(虚拟环境安装的django)仅在虚拟环境处于活动状态时才可以使用
四、在Django中安装项目
django - admin.py startproject learning_logs |
五、创建数据库
python manage.py migrate |
六、查看项目
python manage.py runserver |
B、创建应用程序
七、创建应用程序
python manage.py startapp learning_logs |
八、定义模型
CharField-由字符和文本组成的数据
DateTimeField-记录日期和时间的数据
其他字段类型参考https://docs.djangoproject.com/en/1.8/ref/models/fields/
from django.db import models # Create your models here. class Topic(models.Model): """用户学习的主题""" text = models.CharField(max_length = 200 ) date_added = models.DateTimeField(auto_now_add = True ) def __str__( self ): """返回模型的字符串表示""" return self .text |
Django调用方法__str__()来显示模型的简单表示。在这里,我们编写__str__(),它返回存储在属性text中的字符串。
九、激活模型
INSTALLED_APPS = ( 'django.contrib.admin' , 'django.contrib.auth' , 'django.contrib.contenttypes' , 'django.contrib.sessions' , 'django.contrib.messages' , 'django.contrib.staticfiles' , # My apps 'learning_logs' , ) |
python manage.py makemigrations learning_logs |
命令makemigrations让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。输出表明Django创建一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。
python manage.py migrate |
这个命令的大部分输出都与我们首次执行命令migrate的输出相同。我们需要检查的是图中最后一行的输出行。在这里,Django确认learning_logs应用迁移时一切正常。
注意:每当修改项目的数据时,都采取一下三个步骤:
1、修改models.py
2、对文件(这里是learning_logs)调用makemigrations
3、让Django迁移项目
C、Django管理网站
十、创建超级用户
python manage.py createsuperuser |
Django并不会存储输入的密码,而存储从该密码派生出来的一个字符串——散列值。每当输入密码时,Django都计算其散列值,并将结果与存储的散列值进行计较。通过存储散列值,即便黑客获得了网站数据库的访问权,也只能获取其中存储的散列值,而无法获得密码。在网站配置正确的情况下,几乎无法根据散列值推导出原始密码。
十一、向管理网站注册模型
from django.contrib import admin from learning_logs.models import Topic # Register your models here. admin.site.register(Topic) # 让Django通过管理网站管理我们的模型 |
访问runserver地址(可以指定端口),输入刚刚创建的超级用户的用户名和密码。
十二、添加主题
点击“add”
进入添加新主题的表单,输入“chess”,单击“Save”
查看添加的topic
D、定义模型Entry
十三、创建模Entry
第一个属性topic是一个ForeignKey实例。外键是一个数据库术语,它引用了数据库中的另一条记录;这些代码将每个条目关联到特定的主题。每个主题创建时,都给他分配一个键(或ID)
。需要在俩项数据之间建立联系时,Django使用与每项信息相关联的键。
class Entry(models.Model): """学到的有关某个主题的具体知识""" topic = models.ForeignKey(Topic, on_delete = models.CASCADE) text = models.TextField() date_added = models.DateTimeField(auto_now_add = True ) class Meta: # Meta存储用于管理模型的额外信息,在这里,它让我们能够设置一个特殊属性,让Django在需要时使用entries来表示多个条目 verbose_name_plural = 'entries' def __str__( self ): """返回模型中的字符串表示""" return self .text[: 50 ] + '...' # 只显示前50个字符 |
十四、迁移模Entry
python manage.py makemigrations learning_logs python manage.py migrate |
十五、向管理网站注册Entry
from django.contrib import admin from learning_logs.models import Topic, Entry # Register your models here. admin.site.register(Topic) admin.site.register(Entry) |
十六、添加一个条目
点击Entry的“add”
选择主题创建条目
保存信息
E、Django Shell
十七、交互式shell会话
python manage.py shell |
注意:每次修改模型后,都需要重启shell,这样才能看到修改的效果。要退出shell会话,可按Ctr+D;如果是windows系统,应按Ctr+Z,再按回车。
F、创建网页:学习笔记主页
十八、映射URL
在learning_log文件夹下的urls.py中添加一行代码来包含模块learning_logs.urls。这行代码包含实参namespace,让我们能够将learning_logs的URL同项目中的其他URL区分开来。
from django.contrib import admin from django.urls import path from django.conf.urls import include, url urlpatterns = [ path( 'admin/' , admin.site.urls), url(r' ', include((' learning_logs.urls ', ' learning_logs '), namespace=' learning_logs')), ] |
在learning_logs中创建一个urls.py
"""定义learning_logs的URL模式""" from django.conf.urls import url from . import views urlpatterns = [ # 主页 url(r '^$' , views.index, name = 'index' ), ] |
十九、编写视图
from django.shortcuts import render # Create your views here. def index(request): """学习笔记的主页""" return render(request, 'learning_logs/index.html' ) |
二十、编写模版
在leaning_logs中创建一个文件夹templates,在里面创建一个learning_logs文件夹,新建一个文件,并将其命名为index.html
< p >Learning Logs</ p > < p >Learning Log helps you keep track of your learning, for any topic you're learning about.</ p > |
G、创建其他网页
二十一、模版继承-父模版
< p > < a href = "{% url 'learning_logs:index' %}" >Learning Log</ a > </ p > {% block content %}{% endblock content %} |
二十一、模版继承-子模版
重新编写index.html
{% extends "learning_logs/base.html" %} {% block content %} < p >Learning Log helps you keep track of your learning, for any topic you're learning about.</ p > {% endblock %} |
二十一、显示所有主题的页面
修改learning_logs/urls.py文件
"""定义learning_logs的URL模式""" from django.conf.urls import url from . import views urlpatterns = [ # 主页 url(r '^$' , views.index, name = 'index' ), # 显示所有的主题 url(r '^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, 'learning_logs/index.html' ) def topics(request): """显示所有的主题""" topics = Topic.objects.order_by( 'date_added' ) context = { 'topics' : topics} return render(request, 'learning_logs/topics.html' , context) |
创建显示所有主题的页面的模版
{% extends "learning_logs/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 'learning_logs:index' %}" >Learning Log</ a > </ p > {% block content %}{% endblock content %} |
H、显示特定主题的页面
二十二、URL模式
创建一个专注于特定主题的页面——显示该主题的名称及该主题的所有条目。修改learning_logs/urls.py文件
"""定义learning_logs的URL模式""" from django.conf.urls import url from . import views urlpatterns = [ # 主页 url(r '^$' , views.index, name = 'index' ), # 显示所有的主题 url(r '^topics/$' , views.topics, name = 'topics' ), # 特定主题的详细页面 url(r '^topics/(?P<topic_id>d+)/$' , views.topic, name = 'topic' ), ] |
正则表达式:r'^topics/(?P<topic_id>d+)'
r让Django将这个字符串视为原始字符串,并指出正则表达式包含在引号内。/(?P<topic_id>d+)/与包含在俩个斜杠内的整数匹配,并将这个整数存储在一个名为topic_id的实参中。这部分表达式俩边的括号捕获URL中的值;?<topic_id>将匹配的值存储到topic_id中;而表达式d+与包含在俩个斜杠内的任何数字都匹配,不管这个数字为多少位。
二十三、视图
函数topic()需要从数据库中获取指定的主题以及与之相关联的所有条目。
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, 'learning_logs/topic.html' , context) |
这个函数接受正则表达式?<topic_id>d+捕获的值,并将其存储到topic_id中。date_add前面的减号指定按降序排序。
二十三、模板
{% extends "learning_logs/base.html" %} {% block content %} < p >Topic: {{ topic }}</ p > < p >Entries:</ p > < ul > {% for entry in entries %} < li > < p >{{ entry.date_added |date:'M d,Y H:i' }}</ p > < p >{{ entry.text|linebreaks }}</ p > </ li > {% empty %} < li > There are no entries for this topic yet. </ li > {% endfor %} </ ul > {% endblock content %} |
每个项目列表都将列出两项信息:条目的时间戳和完整的文本。为列出时间戳,我们显示属性date_added的值。在Django模版中,竖线(|)表示模版过滤器——对模版变量的值进行修改的函数。过滤器date:'M d,Y H:i'以这样的格式显示时间戳。接下来一行显示text完整值,而不仅仅是entry的前50个字符。过滤器linebreaks将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块。
二十四、将显示所有主题的页面中的每个主题都设置为链接
{% extends "learning_logs/base.html" %} {% block content %} < p >Topics</ p > < ul > {% for topic in topics %} < li > < a href = "{% url 'learning_logs:topic' topic.id %}" >{{ topic }}</ a > </ li > {% empty %} < li >No topics have been added yet.</ li > {% endfor %} </ ul > {% endblock content %} |