本文是根据图灵程序设计丛书——《Python编程从入门到实践》来实践的
我用的Anaconda+pycharm来实践的,虚拟环境用的是Django1.11.4版本
走过很多弯路,曲曲折折,现在好多地方还是稀里糊涂的,在这里把这些东西写下来,算是对自己学习的一个记录,也希望有需要的朋友可以用来当个参考。本人是年龄偏大的小白,能力不足水平有限,如果有任何问题,还请您多多指教,在这里先行谢过!!!
20181029更新
第一部分 Django入门
一、建立项目
1、打开Anaconada 里面的 prompt,创建虚拟环境,conda create -n my_env,这个名字可以随便取
2、 安装django :conda install django
3、cd到想要的位置,创建项目: django-admin startproject learning_log
4、创建数据库: python manage.py migrate
5、查看项目 ,启动服务器: python manage.py runserver
在浏览器中输入127.0.0.1:8000
会用到的命令
conda env list 显示虚拟环境列表
activate my_env 激活虚拟环境
deactivate 停止使用虚拟环境
二、创建应用程序
1、打开另外一个prompt 终端窗口,切换到manage.py 所在的目录,激活该虚拟环境。
并使用 python manage.py startapp learning_logs
startapp learning_logs命令创建了一个应用程序所需要的基础设施
2、定义模型
使用pycharm里打开learning_logs 文件夹里的models.py,在里面输入以下内容
class Topic(models.Model):
"""用户学习主题"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
3、激活模型
首先,在settings.py里面添加learning_logs
然后使用: python manage.py makemigrations learning_logs
命令makemigrations 让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。
python manage.py migrate
应用这种迁移
**每当要修改“学习笔记”管理数据时,都采取如下三个步骤:1、修改models.py 2、修改settings.py并对learning_logs调用makemigrations 3、让Django迁移项目 migrate **
3、Django管理网站
3.1创建超级用户
python manage.py createsuperuser
3.2向管理网站注册模型
修改admin.py
from learning_logs.models import Topic
admin.site.register(Topic)
之后访问网站http://127.0.0.1:8000/admin,就可以输入超级用户名和密码,可以添加和修改用户名和用户组了,还可以管理与刚才定义的模型Topic 相关的数据。
3.3添加主题
单击Topcis进入主题网页,单击Add,将看到添加新主题的表单,在第一个框中输入chess,再单击save. 继续添加Rock Climbing,再save 保存。
2018.1030更新!!!!!!
4、定义模型Entry
多对一关系,即多个条目对应一个主题
在models.py中继续添加
from django.db import models
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.text
#### Entry类是新添加的
class Entry(models.Model):
topic = models.ForeignKey(Topic)###在django2.0版本,是需要添加on_delete=models.CASCADE
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
return self.text[:50]+"..."
这里牵涉到不同的django版本的问题,为了学习方便,我用的是django1.11.4
5、迁移模型
每次添加一个新模型,都需要用到下面连个命令来迁移数据
python manag.py makemigrations appname
python manage.py migrate
6、向管理网站注册
注册模型Entry,admin.py中加入
from . import Topic,Entry
admin.site.register(Entry)
7、Django shell
python manage.py shell启动Python解释器
三、创建网页:学习笔记主页
创建网页的三个阶段:定义URL、编写视图、编写模板
1、映射URL
将基础URL(127.0.0.1:8000)映射到学习笔记主页
打开项目主文件夹中的learning_log中的urls.py(主url)
from django.contrib import admin
from django.conf.urls import include,url
urlpatterns = [
url(r'^admin/',include(admin.site.urls) ),
url(r'',include('learning_logs.urls',namespace='learning_logs') ),
]
我们需要在learning_logs中创建创建另一个urls.py 文件(从url),它被包含(include)在主文件夹下的urls.py中
learning_logs中的urls.py 文件
from django.conf.urls import url
from . import views
urlpatterns = [
#主页
url(r'^$', views.index,name='index'),
]
2、编写视图
在应用learning_logs中的views.py中,创建新的视图
from django.shortcuts import render
def index(request):
#学习笔记主页
return render(request,'learning_logs/index.html')
3、编写模板
在learning_logs中新建templates文件夹,并在其中新建learning_logs文件夹,在其中新建一个index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<p>Learning Log</p>
<p>Learning Log就是学习笔记啊
</p>
</body>
</html>
现在,输入127.0.0.1:8000/,将看到刚才创建的index.html,而不是默认的django网页了。django调用请求的url,发现URL与learning_logs中的url的 url(r’^$’, views.index,name=‘index’)相匹配,然后访问index.html
四、创建其他网页
将创建两个显示数据的网页,一个列出所有的主题,另一个显示特定主题的所有条目。
我们将先创建一个父模板
1、模板继承
编写一个包含通用元素的父模板,并让每个网页都继承这个模板。
(1)父模板
在tmplates的learning_logs中创建一个base.html,这个文件包含所有页面的元素,其他模板都将继承base.html。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}
</body>
</html>
(2)子模板
重新编写子模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Learning Log就是学习笔记啊</p>
{% endblock content %}
</body>
</html>
2、显示所有主题的页面
(1)URL模式
定义显示所有主题的页面的URL。我们使用一个简单的URl片段
来指出网页显示的信息。我们使用topics ,URL :127.0.0.1:8000/topics /将返回显示所有主题的页面
修改后的learnings_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')
]
(2)视图
函数topics()需要从数据库中获取数据,并发送给模板。
修改后的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)
(3)模板
创建topics.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>topics</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>{{ topic }}</li>
{% empty %}
<li>没有主题被添加</li>
{% endfor %}
</ul>
{% endblock content %}
</body>
</html>
修改父模板base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>-
#加入Topics的a链接
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
</body>
</html>
3、显示特定主体页面
创建一个专注于特定主题的页面——显示该主题的名称及该主题的所有条目,所以我们将定义一个新的URL模式,编写一个视图并创建一个模板。
(1)、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.topics,name='topic'),###新增加的url
]
(2)、视图
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)
##新增的topic函数,将内容返回给topic.html
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)
(3)、模板
显示主题的名称和条目的内容,新建topic.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>topic</title>
</head>
<body>
{% 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>
这个主题没有条目
</li>
{% endfor %}
</ul>
{% endblock content %}
</body>
</html>
(4)、将显示所有主题的页面中的每个主题都设置为链接
修改topics.html,让每个主题都链接到相应的网页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>topics</title>
</head>
<body>
{% 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>没有主题被添加</li>
{% endfor %}
</ul>
{% endblock content %}
</body>
</html>
照着书本抄脚本,也会出现一些小错误,头痛!!!