1. 构建激活虚拟环境 py36_django

  1. activate py36_django

2. 新建项目

G:
cd <dir> 
django-admin startproject <name>
#数据库迁徙
cd <project_path>
python manage.py migrate
#后台设置
python manage.py createsuperuser
Username (leave blank to use 'cx'): cx
Email address:
Password:
Password (again):
Superuser created successfully.

3. 新建应用app

python manage.py startapp <appname>

7 构建实验室博客网站 - 图1

proj-lab 整体项目文件夹

proj-lab 项目文件夹

s2aclab 应用文件夹

3.1 项目settings.py 设置

INSTALLED_APPS = [ ‘django.contrib.admin’,

  'django.contrib.auth',

  'django.contrib.contenttypes',

  'django.contrib.sessions',

  'django.contrib.messages',

  'django.contrib.staticfiles',

  **'s2aclab',    #    对新建的app进行注册**

] LANGUAGE_CODE = ‘zh-Hans’ 设定后台中文 以及 时区 TIME_ZONE = ‘Asia/Shanghai’

3.2 app/models.py

#coding=gbk
from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class ArticleType(models.Model):
    type_name = models.CharField(max_length=20)
    def __str__(self):
        #显式显示
        return self.type_name

class Articles(models.Model):
    title = models.CharField(max_length=50)
    article_type = models.ForeignKey(ArticleType,on_delete=models.DO_NOTHING)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    created_time = models.DateTimeField(auto_now_add=True)
    last_updated_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        #显式显示
        return "<Article:%s>" % self.title

3.3 同步数据库

对于需要使用的应用,首先进行3.1中的注册,每次修改数据项后需要再进行同步数据库

python manage.py makemigrations ->制造迁移 python manage.py migrate -> 迁移 生成0001_initial.py数据库迁移文件

7 构建实验室博客网站 - 图2

在app文件夹下的admin.py中导入models.py的类或方法注册

list_display中键的内容可以在migrations文件下文件中查看:

from django.contrib import admin
from .models import Articles,ArticleType

# Register your models here.
@admin.register(ArticleType)
class ArticleTypeAdmin(admin.ModelAdmin):
    list_display = ('id', 'type_name')
@admin.register(Articles)
class ArticlesAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'article_type',
                    'author',
                    'created_time',
                    'last_updated_time')

此时进入后台,可以在自定义的应用中添加内容,若添加失败

Django - No such table: main.auth_user___old 需要更新django pip install Django — upgrade

4. 页面显示

4.1 使用模板

前端页面和后端代码分离 减轻耦合性

在应用文件夹中创建文件夹 templates。其规定在project的settings中

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

在templates下创建html文件。每个.html与views文件中对应的类或函数绑定进行。同时views中的类和函数与urls文件的path绑定。达成前端后端关联。

4.2 templates :html

.html文件中有很多相似模块化的代码,重构比较繁琐,可以设置一个同一目录下公用的base.html框架文件。

全局模板文件夹

project/settings.py -> TEMPLATES ->DIRS

项目根目录下新建templates文件夹,将上述的公共架构base.html放入文件夹中,修改settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR,'templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
#其中 BASE_DIR为settings开头自动生成的根目录路径
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

base.html 项目文件夹下

<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}{% endblock %}</title>
    {% block header_extends %}
    {% endblock%}
</head>
<body>
    <div class="navigation">
        <a class="logo" href='{% url 'home' %}'>
            <h3>S2AC.Blog</h3>
        </a>
        <a href="/">Home</a>
        <a href="{% url 'articles_list' %}">Article</a>
    </div>
    {% block content %}
    {% endblock %}
</body>
</html>

home.html 项目文件夹下

{% extends 'base.html' %}
{% load static%}

{% block title %}
S2AC|HOME
{% endblock %}

{% block header_extends %}
<link rel="stylesheet" href="{% static 'home.css' %}" {% endblock%} {% block content %} <h3 class="home_content">
Welcome to S2AC home! </h3>
{% endblock %}

app文件夹下

**article_details.html**
<!-- coding=gbk -->
{% extends 'base.html' %}
<!--title -->
{% block title %}
    {{article.title}}
{% endblock %}

<!-- content-->
{% block content %}
    <h3>{{ article.title }}</h3>
    <p>Posted by {{ article.author }}</p>
    <p>At: {{ article.created_time| date:"Y-m-d H:i:s"}}</p>
    <p>Type:
        <a href="{% url 'article_with_type' article.article_type.pk %}">
            {{ article.article_type }}
        </a>
    </p>
<p>{{ article.content }}</p>
{% endblock %}
**articles_list.html**
<!-- coding=gbk -->
<!-- home -->
{% extends 'base.html' %}
<!-- title -->
{% block title %}
    lab site
{% endblock%}

<!-- content -->
{% block content %}
    {% for art in articles %}
        <a href="{% url 'article_details' art.pk %}">
            <h3>{{ art.title }}</h3>
        </a>
        <p>{{ art.content| truncatewords:30 }}</p>
    {% empty %}
        <p>--暂无文章,敬请期待--</p>
    {% endfor %}
    <p>共有{{ articles| length }}篇文章</p>
{% endblock %}
**article_with_type.html**
<!-- coding=gbk -->
{% extends 'base.html' %}
<!--title -->
{% block title %}
    {{article_type.type_name}}
{% endblock %}

{% block content %}
    <h3>{{article_type.type_name}}</h3>
    {% for art in articles %}
        <a href="{% url 'article_details'art.pk %}">
            <h3>{{ art.title }}</h3>
        </a>
        <p>{{ art.content| truncatewords:30 }}</p>
    {% empty %}
        <p>--暂无文章,敬请期待--</p>
    {% endfor %}
    <p>共有{{ articles | length }}篇文章</p>
{% endblock %}

模板嵌套

# block  站网页位置
# includ 导入网页标签
# extends 导入网页模板

#    在其他html中调用base.html
{% extends 'base.html' %}

调用base.html中的方法
<!--title-->
{% block title %}
    当前html文件需要设置的标题
{% endblock %}
<!--content-->
{% block content %}
    当前html文件需要设置的内容
{% endblock %}

4.3 templates: CSS 页面设计

导航 主题内容 尾注

CSS: Cascading Style Sheets

层叠样式表 一种用来表现html或者xml等文件样式的计算机语言

使用静态文件

css代码 ->  CSS文件  --|
            js文件  --| -静态文件
              图片  --|

project目录下新建static静态文件夹

settings.py中设置来调用此static文件夹中的内容

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

在html文件中

{% load static %}
<link rel='stylesheet' href='{% static 'base.css' %}'>

在二级引用得html中,例如base.html需要上两行代码加载css文件 但在home.html中,home加载了一部分base.html模板。

{% extends 'base.html' %}

但这一步不能集成base.html得css文件,需要设置

{% load static %}

若要加载home.css文件 需要添加

{% block header_extends %}
    <link rel="stylesheet" href="{% static 'home.css' %}">
{% endblock %}

home.css

h3.home_content{
    font-size: 200%;
    text-align: center;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}

base.css

*{
    margin: 0;
    padding: 0;
}
div.navigation{
    background-color: #eeeeee;
    border-bottom: 1px solid #cccccc;
    padding: 10px 10px;
}
div.navigation a{
    text-decoration: none;
    color: #000000;
    padding: 5px 10px;
}
div.navigation a.logo{
    display: inline-block;

}

4.4 路由urls

总路由urls.py包括app的urls

            |- app1 urls 
项目总urls---|- app2 urls
            |- app3 urls

可以从项目总urls中提取app urls放到app目录下方便管理;

app/urls.py

from django.urls import path
from . import views
#start with article
urlpatterns = [
        path('<int:art_pk>', views.article_details,name='article_details'),
        path('', views.articles_list, name='articles_list'),
        path('type/<int:art_type_pk>',views.article_with_type,name='article_with_type')
]

project/urls.py

from django.contrib import admin
from django.urls import path,include
from . import views

urlpatterns = [
    path('',views.home,name='home'),
    path('admin/', admin.site.urls),
    path('article/',include('s2aclab.urls')),
]
#include('app目录下的urls')

同时在project文件夹下新建views.py,与项目urls绑定,设为主页home。也可将主页放在app文件夹下,但在多app项目中,这样容易混乱。

#project/views.py
from django.shortcuts import render

def home(request):
    context = {}
    return render(request,'home.html',context)

对项目urls修改

* pip一键导出和安装部署环境

pip freeze —> 显示当前项目依赖库

pip freeze > requirements.txt —> 依赖库存储到

            --> 当前目录下txt中

pip install -r requirements.txt —> 一键安装所有依赖库

         博文+博文分类
         一篇博文一种分类
         一篇博文多种分类