基于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.nameclass Tag(models.Model):
name = models.CharField(max_length=30,verbose_name=“标签名”,db_index=True)
class Meta():
db_table=“标签名”
def str(self):
return self.nameclass 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, Tagadmin.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 & 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> & 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">© 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')