专栏首页二爷记Django个人博客,三小时带你入门Django框架

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

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

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

它们各自的职责如下:

层次职责

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

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

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

Django里重要的概念有:

路由映射

视图函数

模板渲染

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

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

三小时带你入门Django框架

效果:

项目:

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

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

django-admin django_introduction

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

创建完毕

目录输入运行命令:

python manage.py runserver 0.0.0.0:8000

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

第二步:新建app

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

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

两个方法:

1.cmd命令模式

python manage.py startapp bolg

2.在pycharm的terminal窗口创建APP

使用 manage.py Task 工具创建APP

参考:

第三步:注册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 lang="en">
<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 class="col-md-9",role="main">
        <div class="body-main">
            <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 class="body-footer">
<div class="clo-md-4 col-md-offset-3">
    <nav aria-label="Page navigation">
  <ul class="pagination">
    <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 class="col-md-3",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 lang="en">
<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 class="body-main">
                {% for section in section_list %}
                <p>{{ section }}</p>
                {% endfor %}

        </div>
</div>
<div>
    <nav aria-label="...">
  <ul class="pager">
    <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

# -*-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()

以上代码参考来源:

慕课网

本文分享自微信公众号 - 二爷记(eryeji),作者:调侃二大爷

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬取杜赛博客教程内容,应用pdfkit打印pdf文件

    听说杜佬的博客更新了,尤其是django教程,本渣渣由于没有钱充值网络,所以一直是断网状态下,本身也是有搜集教程进文件夹吃灰的通病,因此就有了这样一篇渣渣文,应...

    二爷
  • 百度统计后台总是被广告骚扰?看看应用python是如何实现的

    相信不少老哥们在看百度统计后台流量来源的时候,都能看到很多莫名其妙的来源,其中很多都是广告垃圾网站以及匪夷所思的广告搜索词,心理莫名来一句,百度就是辣鸡,操蛋,...

    二爷
  • Python调用ip代理案例,快代理api调用demo

    Python调用ip代理案例,demo,参考官方给出的案例,整理,这里使用的是快代理api,可以实现ip代理的更换,主要整理了requests的调用以及无头浏览...

    二爷
  • linux进程常用命令

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

    bear_fish
  • JavaScript 风格指南 [每日前端夜话(0x1C)]

    原文链接:https://github.com/ryanmcdermott/clean-code-javascript

    疯狂的技术宅
  • Vue图片验证码-自定义组件高级版

    需要注意的是如果需要在一个页面上引用两个验证码组件,那么需要自己新建两个验证码模块组件,

    kirin
  • android断点下载

    断点下载往往用在大文件的下载过程中,如传统的迅雷下载用的就是断点下载技术,说起来原理比较简单:对文件进行分片,并对分片的文件进行标记,然后分片下载,下载完成后对...

    xiangzhihong
  • 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(二)语法分析

    以下规则从左往右看,表示左边的表达式还能继续往下细分成右边的表达式,一直细分到不可再分为止。

    谭光志
  • Oculus + Node.js + Three.js 打造VR世界

    Oculus Rift 是一款为电子游戏设计的头戴式显示器。这是一款虚拟现实设备。这款设备很可能改变未来人们游戏的方式。 周五Hackday Showcase的...

    李海彬
  • 简单学习Es6中的this指向

    对于一个前端初学者来说,this的指向是一个必须要掌握的知识点,尤其是es6之后的this指向更加变得飘忽不定,我们今天就来了解一下各种情况下this的指向。

    憧憬博客

扫码关注云+社区

领取腾讯云代金券