基于Django的学习

什么是Django

通俗的说,Django是一个用python语言写的开源web开发框架,采用了MVC的框架模式.开发快捷高效。

Django的MVC框架模式

首先,大部分开发语言都有MVC框架,其优势降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用。

MVC的解释

M : 表示model,主要用于对数据库的封装
V :表示view,用于向用户展示结果,通常与html文件使用向用户显示结果。
C :表示controller,是Django的核心,用于处理请求,获取数据,返回结果。

Django的MVT框架

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

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

处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
模板(Template),即表现层

处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即业务逻辑层

存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

内容简介

创建Django项目流程:

  • 环境搭建
  • 定义模型
  • 使用后台管理
  • 编写视图
  • 定义模版

创建项目

命令:django-admin startproject (项目名)
此时会创建目录:
.
|-- manage.py
|-- ww
|-- init.py
|-- settings.py
|-- urls.py
| – wsgi.py
目录说明:

  • manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互
  • ww:内层的目录,项目真正的Python包
  • init.py: 一个空文件,表明这是一个python包
  • settings.py:项目的配置
  • urls.py:项目的URL声明,构建url路径
  • wsgi.py:项目与WSGI兼容的Web服务器入口,它只要求Web开发者实现一个函数,就可以响应HTTP请求

通过案例更加了解Django

数据库的配置

在settings文件中,通过DATABASES项进行数据库的设置
注意:django支持的数据库包括:sqlite,mysql等主流数据库。
Django默认使用SQLite数据库

创建应用

在命令行输入命令:
python manage.py startapp blog

定义数据库模型

定义模型类
  • 有一个数据表,就有一个模型类与之对应

  • 打开models.py 文件,定义模型类

  • 引入包 from django.db import models

  • 模型类继承自models.Model类

  • 注意:不需要定义主键列,在生成时会自动添加,并且值为自动增长。

    from django.contrib.auth.models import User
    from django.db import models

    #Create your models here.

    class Category(models.Model):
    name = models.CharField(max_length=30,verbose_name=“分类名”,db_index=True)

    class Meta():
    db_table=“分类名”
    ordering = [‘id’]

    def str(self):
    return self.name

    class Tag(models.Model):
    name = models.CharField(max_length=30,verbose_name=“标签名”,db_index=True)
    class Meta():
    db_table=“标签名”
    def str(self):
    return self.name

    class Post(models.Model):
    title = models.CharField(max_length=100,db_index=True)
    body = models.TextField()

    create_time = models.DateTimeField()
    #最后一次修改博客的时间
    modified_time = models.DateTimeField()
    read_num = models.IntegerField(default=0)
    comment_num = models.IntegerField(default=0)

    tags = models.ManyToManyField(Tag)

    category = models.ForeignKey(Category,on_delete=models.SET_NULL,null = True)
    author = models.ForeignKey(User,on_delete=models.SET_NULL,null=True)
    def str(self):
    return self.title

生成数据表

将创建的应用添加到settings.py文件的INSTALLED_APPS中
INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘blog’,
]
接着生成迁移文件,根据模型类生成sql语句
python manage.py makemigrations
执行迁移,执行sql语句生成数据表
python manage.py migrate

查询所有信息

post = Post.objects.all()

查找特指的图书信息

b = Post.objects.get(查询条件)
post.title=‘好好学习’
post.save() 保存
post.delete() 删除

服务器的运行

python manage.py runserver
注意:如果修改文件不需要重启服务器,如果增删文件需要重启服务器

后台管理

管理操作:
  • 站点分为“内容发布”和“公共访问”两部分

  • “内容发布“的部分负责添加,修改,删除内容,开发这些重复的功能非常之无聊,所以Django会根据定义的模型类完全自动的生成管理模块,即向admin.py文件中注册模型类

  • 在admin.py文件中

    • from django.contrib import admin

    #Register your models here.
    from blog.models import Post, Category, Tag

    admin.site.register(Post)
    admin.site.register(Category)
    admin.site.register(Tag)
    刷新页面,可以对注册的数据表进行增删改查
    注意:如果在使用str方法返回中文,在修改和添加时报ascii的错误,此时应将字符串末尾添加“.encode(‘utf-8’)”

创建django的管理

python manage.py createsuperuser 输入回车,按照提示输入用户名,邮箱,密码

管理界面本地化
  • 编辑settings.py文件,设置编码,时区
    LANGUAGE_COOE = ‘ZH-Hans’
    TIME_ZONE = ‘Asia/Shanghai’
    在这里插入图片描述

URL设置

总的url地址显示:
from django.contrib import admin
from django.urls import path, include

from blog.views import index

urlpatterns = [
path(‘admin/’, admin.site.urls),
path(‘comments/’,include(‘comments.urls’)),
path(’’,include(‘blog.urls’))

]

模版(HTML文件)

  • 修改settings.py 文件,设置TEMPLATES的DIRS值
    ‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]
    -在模版中访问视图传递的数据
    {{ 输出值(可以是变量,也可以是对象的属性) }}
    {% 执行代码段 %}
定义模版
{% load blog_tags %}
<!DOCTYPE html>
<html>
<head>
    <title>Black &amp; White{% block title %} {% endblock %}</title>

    <!-- meta -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- css -->
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="/static/css/pace.css">
    <link rel="stylesheet" href="/static/css/custom.css">
    <link rel="stylesheet" href="/static/css/highlights/github.css">

    <!-- js -->
    <script src="/static/js/jquery-2.1.3.min.js"></script>
    <script src="/static/js/bootstrap.min.js"></script>
    <script src="/static/js/pace.min.js"></script>
    <script src="/static/js/modernizr.custom.js"></script>
</head>

<body>
<div class="container">
    <header id="site-header">
        <div class="row">
            <div class="col-md-4 col-sm-5 col-xs-8">
                <div class="logo">
                    <h1><a href="/templates/blog/index.html"><b>Black</b> &amp; White</a></h1>
                </div>
            </div><!-- col-md-4 -->
            <div class="col-md-8 col-sm-7 col-xs-4">
                <nav class="main-nav" role="navigation">
                    <div class="navbar-header">
                        <button type="button" id="trigger-overlay" class="navbar-toggle">
                            <span class="ion-navicon"></span>
                        </button>
                    </div>

                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li class="cl-effect-11"><a href="{% url 'index' %}" data-hover="首页">首页</a></li>
                            <li class="cl-effect-11"><a href="{% url 'index' %}" data-hover="博客">博客</a></li>
                            <li class="cl-effect-11"><a href="{% url 'about' %}" data-hover="关于">关于</a></li>
                            <li class="cl-effect-11"><a href="{% url 'contact'%}" data-hover="联系">联系</a></li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </nav>
                <div id="header-search-box">
                    <a id="search-menu" href="#"><span id="search-icon" class="ion-ios-search-strong"></span></a>
                    <div id="search-form" class="search-form">
                        <form role="search" method="get" id="searchform" action="#">
                            <input type="search" placeholder="搜索" required>
                            <button type="submit"><span class="ion-ios-search-strong"></span></button>
                        </form>
                    </div>
                </div>
            </div><!-- col-md-8 -->
        </div>
    </header>
</div>
<div class="copyrights">Collect from <a href="http://www.cssmoban.com/">网页模板</a></div>
<div class="copyrights">Modified by <a href="http://zmrenwu.com/">西部开源技术中心的博客</a></div>

<div class="content-body">
    <div class="container">
        <div class="row">
            <main class="col-md-8">

                {% block main %}
                {#页面主题#}
                {% endblock %}


            </main>
            <aside class="col-md-4">
                <div class="widget widget-recent-posts">
                    <h3 class="widget-title">最新文章</h3>
                    <ul>
                        {% get_recent_posts as posts %}
                        {% for post in posts %}
                        <li>
                            <a href="#">{{ post.title }}</a>
                        </li>
                        {% endfor %}

                    </ul>
                </div>

                <div class="widget widget-archives">
                    <h3 class="widget-title">归档</h3>
                    <ul>
                        {% get_archive as archives %}
                        {% for archive in archives %}
                        <li>
                            <a href="{% url 'archive' archive.year archive.month %}">{{ archive.year }}年{{ archive.month }}月</a>
                        </li>
                        {% endfor %}
                    </ul>
                </div>

                <div class="widget widget-category">
                    <h3 class="widget-title">分类</h3>
                    <ul>
                        {% get_categories as categories %}
                        {% for category in categories %}
                        <li>
                            <a href="{% url 'category' category.id %}">{{ category.name }}<span class="post-count">(13)</span></a>
                        </li>
                        {% endfor %}

                    </ul>
                </div>

                <div class="widget widget-tag-cloud">
                    <h3 class="widget-title">标签云</h3>
                    <ul>
                        {% get_tags as tags %}
                        {% for tag in tags %}
                        <li>
                            <a href="{% url 'tag' tag.id %}">{{ tag.name }}</a>
                        </li>
                        {% endfor %}

                    </ul>
                </div>
                <div class="rss">
                    <a href=""><span class="ion-social-rss-outline"></span> RSS 订阅</a>
                </div>
            </aside>
        </div>
    </div>
</div>
<footer id="site-footer">
    <div class="container">
        <div class="row">
            <div class="col-md-12">
                <p class="copyright">&copy 2017 - 采集自<a href="http://www.cssmoban.com/"
                                                        target="_blank" title="模板之家">模板之家</a>
                    - 由<a href="#" title="网页模板" target="_blank">西部开源技术中心的博客</a>修改
                </p>
            </div>
        </div>
    </div>
</footer>

<!-- Mobile Menu -->
<div class="overlay overlay-hugeinc">
    <button type="button" class="overlay-close"><span class="ion-ios-close-empty"></span></button>
    <nav>
        <ul>
            <li><a href="{% url 'index' %}">首页</a></li>
{#            <li><a href="">博客</a></li>#}
            <li><a href="about.html">关于</a></li>
            <li><a href="contact.html">联系</a></li>
        </ul>
    </nav>
</div>

<script src="/static/js/script.js"></script>

</body>
</html>

使用模版,也叫视图函数文件的编写(编辑views文件,调用模版)

from django.core.paginator import EmptyPage, PageNotAnInteger
from django.http import HttpResponse, request
from django.shortcuts import render, get_object_or_404, redirect

# Create your views here.
from markdown import markdown

from blog.models import Post
from comments.forms import CommentForm
from comments.models import Comment


def index(request):
    posts = Post.objects.order_by('-create_time').all()
    from django.core.paginator import Paginator

    postsObj = Paginator(posts,per_page=5)
    page = request.GET.get('page')
    if not page:page=1
    try:
        postObj = postsObj.page(page).object_list
        posts = postsObj.object_list
    except (EmptyPage,PageNotAnInteger):
        posts = postsObj.page(1).object_list
    return render(request,'blog/index.html',context={
        'posts':posts,
        'postObj':postObj
    })

def detail(request, id):
    post=Post.objects.filter(id=id).first()
    post.read_num +=1
    post.save()


    post.body = markdown(
        post.body,
        extensions=[
            'markdown.extensions.extra',
            'markdown.extensions.toc',
            'markdown.extensions.codehilite',
        ]
    )
    form = CommentForm()

    comments=Comment.objects.filter(post=id).all()

    return  render(request, 'blog/detail.html',
                   context={
                       'post':post,
                       'form':form,
                       'comments':comments
                   })

def category(request,id):
    posts = Post.objects.filter(tags=id).all()
    return render(request,'blog/index.html',
                  context={'posts':posts})

def tag(request,id):
    posts = Post.objects.filter(tags=id).all()
    return render(request,'blog/index.html',
                  context={'posts':posts})


def archive(request,year,month):
    posts = Post.objects.filter(create_time__year=year).filter(create_time__month=month).all()
    return render(request,'blog/index.html',
                  context={
                      'posts':posts
                  })

def about(request):
    return render(request,'blog/about.html')

def contact(request):
    return render(request,'blog/contact.html')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值