Django个人博客,三小时带你入门Django框架

Django框架是时下Python语言最热门的Web框架之一,它是一个功能完善、文档齐全、开发敏捷、配置简单的Web框架,能够快速将一个想法实现,使用它能够快速搭建一个网站!

pic_001.jpg

Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。


它们各自的职责如下:

层次职责

模型(Model),即数据存取层模型(Model),即数据存取层

模板(Template),即表现层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

视图(View),即业务逻辑层存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。


Django里重要的概念有:

路由映射

视图函数

模板渲染

Django自带的ORM操作(对象关系映射)

来源:CSDN博主「喝瓶冰阔乐」


三小时带你入门Django框架

效果:

项目:

pic_004.jpg

第一步:新建django项目,项目名:django_introduction

使用 django-admin 来创建 django_introduction 项目:

django-admin django_introduction

这里我使用的是pycharm 新建django项目

pic_005.jpg

创建完毕

目录输入运行命令:

python manage.py runserver 0.0.0.0:8000

在浏览器输入你服务器的 ip(这里我们输入本机 IP 地址:127.0.0.1:8000) 及端口号,如果正常启动,输出结果如下:

pic_006.jpg

第二步:新建app

创建一个app(前提是你已经建立一个django项目)

在项目下创建app: python manage.py startapp app名称

两个方法:

1.cmd命令模式

python manage.py startapp bolg

2.在pycharm的terminal窗口创建APP

使用 manage.py Task 工具创建APP

pic_007.jpg

参考:

pic_008.jpg

第三步:注册app

APP应用创建后需要在项目的同名文件夹中的 settings.py 文件中注册

settings.py

添加 blog  app名 注册! 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

附:

INSTALLED_APPS = [  
    'django.contrib.admin',         #站点管理系统  
    'django.contrib.auth',          #认证系统  
    'django.contrib.contenttypes',      #content types框架  
    'django.contrib.sessions',          #session框架  
    'django.contrib.messages',          #message框架  
    'django.contrib.staticfiles',       #静态文件管理框架

第四步:创建django模型

blog/models.py

from django.db import models

# Create your models here.

class Article(models.Model):
    # 文章的唯一ID
    article_id=models.AutoField(primary_key=True)
    #文章标题
    title=models.TextField()
    #文章摘要
    brief_content=models.TextField()
    # 文章的主要内容
    content=models.TextField()
    #文章的发布日期
    publish_date=models.DateTimeField(auto_now=True)

    #返回(显示)标题
    def __str__(self):
        return self.title

第五步:添加django后台管理

启动项目 

启动项目 访问 127.0.0.1:8000/admin/ 

需要登陆 创建管理员用户密码 

执行 

python manage.py createsuperuser

然后根据提示输入用户名和密码 

然后在访问 127.0.0.1:8000/admin/ 

然后输入账号和密码登陆 

成功后还需要做如下配置

注册后台:

from django.contrib import admin

# Register your models here.
from .models import Article

admin.site.register(Article)

更详细的配置参考:

#  导入模型
from . import models
class UsersAdmin(admin.ModelAdmin):
  # 要展示的字段
  list_display = ('id','uname','age','sex','email','addtime')

  #list_editable 设置默认可编辑字段
  list_editable = ['uname', 'age','email']

   #list_per_page设置每页显示多少条记录,默认是100条
  list_per_page = 10

  #ordering设置默认排序字段,负号表示降序排序
  ordering = ('id',)

  #过滤器 分组
  list_filter =('uname', 'age', 'email') 

   #搜索字段
  search_fields =('uname', 'age', 'email') 

  # 详细时间分层筛选 
  date_hierarchy = 'addtime'

# 注册器
admin.site.register(models.Users,UsersAdmin)

第六步:数据迁移

简短说一下数据库迁移。说白了,其实就是将数据库中的数据导出为sql语句来进行sql操作。而对于django而言,强大之处就在于在通过迁移命令执行数据库迁移后,生成迁移sql语句脚本进行相应的数据库操作。

在数据库迁移之前,我们首先要生成迁移文件,命令耳熟能详

python manage.py makemigrations

或者单独对某一模块进行迁移操作

python manage.py makemigrations [模块名]

这样就生成了迁移文件,在相对应的项目应用中可以看到migrations文件夹下,生成一个新的以数字打头的迁移文件。


而下一步就是执行迁移操作了

python manage.py migrate

或者单独迁移某一模块

python manage.py migrate [模块名]

迁移过之后,我们会发现在数据库中多了迁移模型的数据表,查看相应表也可以看到我们所建立的字段和类型。

但也多了几张表,其中一张便是django_migrations,这张表即是记录我们在每次执行迁移操作时记录的迁移文件的数据表。具体记录的是模块和与其对应的迁移文件名。

来源:简书/PeterPZ


第七步:项目层url的编写

项目路由的编写 urls.py

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


urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/',include('blog.urls'))
]


include函数转发

与blog相关的链接都转发到 blog.urls

可惜 没有写明 name


第八步:app层url的编写

app路由的编写 blog\urls.py

from django.urls import path,include
import blog.views

urlpatterns=[
    path('hello_world.html',blog.views.hello_world),
    path('content',blog.views.article_content),
    path('index.html',blog.views.get_index_page),
    #path('detail.html',blog.views.get_detail_page)
    path('detail/<int:article_id>.html',blog.views.get_detail_page),
    #path('index/<int:page>.html',blog.views.get_index_page),
]

第九步:视图函数的编写

blog\views.py

from django.shortcuts import render
from django.http import HttpResponse
from blog.models import Article
from django.core.paginator import Paginator
# Create your views here.

def hello_world(request):
    return HttpResponse('hello,world!')

def article_content(request):
    article=Article.objects.all()[0]
    title=article.title
    brief_content=article.brief_content
    content=article.content
    article_id=article.article_id
    publish_date=article.publish_date
    return_str='title: %s,brief_content: '\
               '%s,content: %s,article_id: %s,publish_date: %s'%(title,
                                                                 brief_content,
                                                                 content,
                                                                 article_id,
                                                                 publish_date)
    return HttpResponse(return_str)


def get_index_page(request):
    page=request.GET.get('page')
    if page:
        page=int(page)
    else:
        page=1
    print('page_parm:',page)
    article_all=Article.objects.all()
    top5_article_list=Article.objects.order_by('-publish_date')[:5]
    paginator =Paginator(article_all, 7)
    page_num=paginator.num_pages
    print('page_num:',page_num)
    page_article_list=paginator.page(page)
    if page_article_list.has_next():
        next_page=page+1
    else:
        next_page=page
    if page_article_list.has_previous():
        previous_page=page-1
    else:
        previous_page=page
    return render(request,'blog/index.html',
                  {
                      'article_list':article_all,
                      'page_num':range(1,page_num+1),
                      'curr_page':page,
                      'next_page':next_page,
                      'previous_page':previous_page,
                      'top5_article_list':top5_article_list
                  }
                  )



def get_detail_page(request,article_id):
    article_all=Article.objects.all()
    curr_article=None
    previous_index=0
    next_index=0
    previous_article=None
    next_article=None
    for index,article in enumerate(article_all):
        if index==0:
            previous_index=0
            next_index=index+1
        elif index==len(article_all)-1:
            previous_index = index - 1
            next_index=index
        else:
            previous_index=index-1
            next_index = index+1
        if article.article_id==article_id:
            curr_article=article
            previous_article=article_all[previous_index]
            next_article=article_all[next_index]
            break


    section_list=curr_article.content.split('\n')
    return render(request,'blog/detail.html',
                  {
                      'curr_article':curr_article,
                      'section_list':section_list,
                      'previous_article':previous_article,
                      'next_article':next_article
                  }
                  )

第十步:html模板页的编写

首页和详情页

首页

blog/templates/blog/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>三小时入门 Django Web 框架</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div class="container page-header">
    <h1>三小时入门 Django Web 框架
        <small>--by 咚咚呛老师</small></h1>
</div>
<div class="container page-body">
    <div,role="main">
        <div>
            <div>
                {% for article in article_list %}
                    <h2><a href="detail/{{ article.article_id }}.html">{{ article.title }}</a></h2>
                <p>{{ article.brief_content }}</p>
                {% endfor %}
            </div>
        </div>
    <div>
<div class="clo-md-4 col-md-offset-3">
    <nav aria-label="Page navigation">
  <ul>
    <li>
      <a href="/blog/index/{{ previous_page }}.html" aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
      </a>
    </li>
      {% for num in page_num %}
    <li><a href="/blog/?page={{ num }}.html">{{ num }}</a></li>
    {% endfor %}
  <li>
      <a href="/blog/index/{{ next_page }}.html" aria-label="Next">
        <span aria-hidden="true">&raquo;</span>
      </a>
    </li>
  </ul>
</nav>
</div>
</div>
    </div>
    <div,role="complementary">
    <div>
        <h2>最新文章</h2>
        {% for article in top5_article_list %}
        <h4><a href="detail/{{ article.article_id }}.html ">{{ article.title }}</a></h4>
        {% endfor %}
    </div>
    </div>

</div>

</body>
</html>

详情页

blog/templates/blog/detail.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ curr_article.title }}</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div class="container page-header">
<div>
    <h1>{{ curr_article.title }}</h1>
    </div>
</div>
<div class="container page-body">
    <div>
                {% for section in section_list %}
                <p>{{ section }}</p>
                {% endfor %}

        </div>
</div>
<div>
    <nav aria-label="...">
  <ul>
    <li><a href="{{ previous_article.article_id }}.html">上一篇:{{ previous_article.title }}</a></li>
    <li><a href="{{ next_article.article_id }}.html">下一篇:{{ next_article.title }}</a></li>
  </ul>
</nav>
</div>
</body>
</html>


附:导入文章数据的工具源码

tools/import_data.py

pic_009.jpg

# -*-encoding=utf-8 -*-

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_introduction.settings')
django.setup()

from blog.models import Article

data_path='../data/article'

def main():
    content_list=[]
    files=os.listdir(data_path)
    for name in files:
        f= os.path.join(data_path,name)
        with open(f,'r',encoding='utf-8') as f:
            content=f.read()
            item=(name[:-4],content[:100],content)
            content_list.append(item)
    #Article.objects.all().delete()
    for item in content_list:
        print('saving article:%s'%item[0])
        article=Article()
        article.title=item[0]
        article.brief_content=item[1]
        article.content=item[2]
        article.save()

if __name__ =='__main__':
    main()


注意:

在django项目中运行,一定要先载入django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_introduction.settings')
django.setup()

以上代码参考来源:

慕课网

三小时带你入门Django框架 新版上架

https://www.imooc.com/learn/1110

感谢咚咚呛老师!

pic_010.jpg

话说,咚咚呛老师的口头禅,

“好的”,

倍感亲切!


个人总结:

适合新人学习django框架,尤其是你喜欢看视频的话!

课程浅尝截止,学习过一定时间的django学习者,可以当复习参考!

注意:

需要python语法基础!

需要了解django框架!

尤其是学习了一点django框架的话最佳!

课程是免费的,再次感谢!


相关阅读:

去哪儿景点信息爬取并使用Django框架网页展示