使用Django创建“学习笔记”①

规范:编写一个名为“学习笔记”的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)

猜你喜欢

转载自blog.csdn.net/weixin_41448568/article/details/82766520