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> <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">«</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">»</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
# -*-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
感谢咚咚呛老师!
话说,咚咚呛老师的口头禅,
“好的”,
倍感亲切!
个人总结:
适合新人学习django框架,尤其是你喜欢看视频的话!
课程浅尝截止,学习过一定时间的django学习者,可以当复习参考!
注意:
需要python语法基础!
需要了解django框架!
尤其是学习了一点django框架的话最佳!
课程是免费的,再次感谢!
相关阅读: