基于ubuntu16或18,在练习过程中,需要在服务器本地使用浏览器来随时验证练习的效果,因此需要安装图形界面的ubuntu。
1.建立虚拟环境
mkdir learning_log
cd learning_log
learning_log$python -m venv ll_env
如果不能使用模块venv,可安装virtualenv包,可执行如下命令:
$pip install --user virtualenv
或
$sudo apt-get install python-virtualenv
2.激活虚拟环境
learning_log$source ll_env/bin/activate
或
learning_log$. ll_env/bin/activate ##$后面用小数点来代替source
(ll_env)learning_log$deactivate ##关闭运行虚拟环境
learning_log$
3.在虚拟环境中安装Django
(ll_env)learning_log$pip install Django
4.在Django中创建项目
(ll_env)learning_log$django-admin startproject learning_log . ##注意最后有一个空格和小数点
(ll_env)learning_log$ls
learning_log ll_env manage.py
(ll_env)learning_log$ls learning_log
__init__.py settings.py urls.py wsgi.py
5.创建数据库
(ll_env)learning_log$python manage.py migrate
(ll_env)learning_log$ls
db.sqlite3 learning_log ll_env manage.py
6.查看项目
(ll_env)learning_log$python manage.py runserver
运行到此,可以在服务器本地浏览器中输入http://localhost:8000/ 或http://127.0.0.1:8000/
It worked!
Congratulations on your first Django-powered page.
如果出现错误消息“That port is already in use",请执行python manage.py runserver 8001,让Django使得另一个端口。
7.创建应用程序
(ll_env)learning_log$python manage.py startapp learning_logs
(ll_env)learning_log$ls
db.sqlite3 learning_log learning_logs ll_env manage.py
(ll_env)learning_log$ls learning_logs/
admin.py __init__.py mirgrations models.py tests.py views.py
8.定义模型
打开models.py
from django.db import models
class Topic(models.Model):
"""用户学习的主题"""
text = models.CharField(max_length=200)
date_add = models.DataTimeField(auto_now_add = True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
要获悉可在模型中使用的各种字段,请参阅网址:https://docs.djangoproject.com/en/1.8/ref/models/fields/
9.激活模型
打开settings.py
--snip--
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
--snip--
将前面的应用程序添加到这个元组中:
--snip--
INSTALLED_APPS = (
--snip--
'django.contrib.staticfiles',
# 我的应用程序
‘learning_logs',
)
--snip--
接下来,需要让Django修改数据库,使其能够存储与模型Topic相关的信息。
(ll_env)learning_log$ python manage.py makemigrations learning_logs
迁移数据库
(ll_env)learning_log$ python manage.py migrate
每当需求修改“学习笔记”管理的数据时,都采用上面三个步骤:修改models.py;对learning_logs调用makemigratios;让Django迁移项目。
10.Django管理网站
10.1创建超级用户
(ll_env)learning_log$ python manage.py createsuperuser
10.2向管理网站注册模型
打开admin.py
from django.contrib import admin
from learning_logs.models import Topic
admin.site.register(Topic)
现在,使用超级用户帐户访问管理网站:访问http://localhost:8000/admin/
10.3添加主题
如主题是国际象棋和攀岩,输入Chess和Rock Climbing
11.定义模型Entry
要记录学到的国际象棋和攀岩知识,需要在学习笔记中添加条目定义模型。每个条目都与特定的主题相关联,多个条目对同一个主题的关系。
打开models.py
from django.db import models
class Topic(models.Model):
--snip--
class Entry(models.Model):
"""学到的有关某个主题的具体知识"""
topic = models.ForeignKey(Topic)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add = True)
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
"""返回模型的字符串表示"""
return self.text[:50] + "..."
12.迁移模型Entry
(ll_env)learning_log$ python manage.py makemigrations learning_logs
(ll_env)learning_log$ python manage.py migrate
13.向管理网站注册Entry
打开admin.py
from django.contrib import admin
from learning_logs.models import Topic
admin.site.register(Topic)
admin.site.register(Entry)
返回到http://localhost:8000/admin/,将看到learning_logs下列出了Entries
14.Django shell
是测试项目和排除其故障的理想之地。
(ll_env)learning_log$ python manage.py shell
>>>from learning_logs.models import Topic
>>>Topic.objects.all()
[, ]
>>>for topic in topics:
...print(topic.id, topic)
>>>t = Topic.objects.get(id=1)
>>>t.text
Chess
>>>t.date_added
datetime.datetime(2019,12,22,16,24,11,989446,tzinfo =)
>>>t.entry_set.all()
[, ]
15.创建网页:学习笔记主页
三个阶段:定义URL、编写视图和编写模板。
15.1映射URL
打开urls.py(注意:该文件是在项目主文件夹learning_log中的)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [url(r'^admin/', include(admin.site.urls)), ]
将urlpatterns修改:
urlpatterns = [url(r'^admin/', include(admin.site.urls)),
url(r'',include('learning_logs.urls', namespace = 'learning_logs')), ]
创建另一个urls.py(注意:这次是在文件夹learning_logs中)
“”“定义learning_logs的URL模式"""
from django.conf.urls import url
from . import views
urlpatterns = [
# 主页
url(r'^$', views.index, name = 'index'), ]
15.2编写视图
打开views.py
from django.shortcuts import render
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
15.3编写模板
在文件夹learning_logs中新建一个叫templates的文件夹,在templates下再新建一个文件夹learning_logs,并在这个新建的learning_logs文件夹中新建一个index.html文件,index.html里面编写代码如下:
<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
现在打开http://localhost:8000/,将看到刚才创建的网页,而不是默认的Django网页。
15.4创建其他网页
15.4.1父模板
base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}
15.4.2子模板
重新编写index.html,使其继承base.html。
打开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 content %}
16.显示所有主题的页面
16.1URL模式
修改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'), ]
16.2视图
修改views.py
from django.shortcuts import render
from . models import Topic
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)
16.3模板
创建一个文件叫做topics.html,并存储到index.html所在的目录中。下面演示了如何在这个模板中显示主题:
{% 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 %}
修改父模板base.html,使其包含到显示所有主题的页面的链接:
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log </a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
17.显示特定主题的页面
17.1URL模式
修改learning_logs/urls.py
--snip--
urlpatterns = [
--snip--
# 特定主题的详细页面
url(r'^topics/(?p<topic_id>\d+)/$', views.topic, name = 'topic'),
]
17.2视图
函数topic()需要从数据库中获取指定的主题以及与之相关联的所有条目。
修改views.py
--snip--
def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = Topic.objects.get(id = topic_id)
endtries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries':entries}
return render(request, 'learning_logs/topic.html', context)
17.3模板
修改topic.html
{% 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 %}
17.4将显示所有主题的页面中的每个主题都设置为链接
修改topic.html
--snip--
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
--snip--
打开http://localhost:8000/topics/1/