-
创建项目
使用Pycharm创建项目
创建过程使用 Django 模板(默认:选择Anaconda3的python.exe)
会在系统中创建一个虚拟env环境,里面是单独的系统空间,保证不同项目版本不会互相干扰
命令行方式
命令行创建env环境的过程: cmd命令行 执行 pip install virtualenv 在自己保存项目的文件夹下输入 vm ,以后默认将env环境放在这个文件夹里 virtualenv 虚拟环境名(eg: virtualenv env1) (为了省略表达 我们将 project/env/env1 代替为 /*) /*路径 : cd Scripts 输入 : activate 输入 :pip list 查看安装的环境 输入 :pip install django==1.8
-
实现功能
增加博客数据表字段,包括日期、作者、和文章分类(提示:百度查询models的字段)
博客主页面 ,展示所有文章标题
文章详情页,显示数据表所有字段
功能具有新建文章、修改文章、删除文章功能
后台管理界面,要求有时间和分类的过滤器
创建数据表
可以使用SQLite查看数据
在model.py中,创建数据表
from django.db import models # Create your models here. # ORM模式,创建数据表 class Article(models.Model): title = models.CharField(max_length=32, default='title') content = models.TextField(null=True, blank=True) pub_time = models.DateTimeField(auto_now=True) # 自动更新时间戳 author = models.CharField(max_length=32, default='default') # 作者 articleTag = models.CharField(max_length=32, default='unknown') # 文章标签分类 def __str__(self): return self.title
执行如下步骤
在下面的窗口中执行如下命令(修改db数据库后要进行这步修改,不然报错500)
数据迁移 makemigrations 同步到数据库中 migrate
- 执行步骤是
通过 主路由 urls => 分路由urls => views视图 => html 网页
人类思维习惯是书写view视图的逻辑关系,应用到urls,写网页
- 增加app需要在项目setting中进行配置,才能使用
INSTALLED_APPS 内添加 app文件夹的名称
index/models.py
from django.db import models # Create your models here. # ORM模式,创建数据表 class Article(models.Model): title = models.CharField(max_length=32, default='title') content = models.TextField(null=True, blank=True) pub_time = models.DateTimeField(auto_now=True) # 自动更新时间戳 def __str__(self): return self.title
index/views.py
from django.shortcuts import render from .models import Article # Create your views here. # index 首页界面的view窗口 def index(request): # 从数据库加载所有数据返回到前端 articles = Article.objects.all() # 加载函数 # request 请求 # "index.html" 返回页面html # {'articles': articles} 返回的数据 return render(request, "index.html", {'articles': articles}) # context 文章详情页 def article_content(request, art_id): article = Article.objects.get(pk=art_id) return render(request, "content.html", {'art': article}) def article_edit(request, art_id): # str(art_id) 转换成字符串类型 if str(art_id) == '0': return render(request, "edit.html") else: art = Article.objects.get(pk=art_id) return render(request, "edit.html", {'art': art}) # 点击新建和修改的 action函数 # 新建和修改数据 响应函数 返回一个页面 def edit_action(request): # 第二个参数是默认值 title = request.POST.get("title", "DEFAULT") content = request.POST.get("content", "DEFAULT") art_id = request.POST.get("art_id", "0") author = request.POST.get("author", "DEFAULT") articleTag = request.POST.get("articleTag", "DEFAULT") if art_id == '0': Article.objects.create(title=title, content=content, author=author, articleTag=articleTag) # create 在数据库中创建数据 arts = Article.objects.all() # 返回主页面,传回数据库所有数据 return render(request, "index.html", {'articles': arts}) # {'articles': arts} 主页使用的变量:传入自己的变量 else: article = Article.objects.get(pk=art_id) article.title = title article.content = content article.author = author article.articleTag = articleTag article.save() article = Article.objects.get(pk=art_id) return render(request, "content.html", {"art": article}) def article_delete(request, art_id): # 根据 id 获取需要删除的文章 article = Article.objects.get(pk=art_id) # 调用.delete()方法删除文章 article.delete() # 完成删除后返回文章列表 arts = Article.objects.all() return render(request, "index.html", {'articles': arts})
urls.py
主路由 blog/urls.py
from django.contrib import admin from django.urls import path, include from index import views # 主路由 urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include("index.urls")), # 指向app index的 分路由index.urls # 页面 ]
分路由 index/urls.py
from django.urls import path, re_path from index import views # url -> views -> html # 命名空间 app_name = "blog" # 分路由 urlpatterns = [ # index 主页路由 path('index/', views.index, name="index"), # 文章详情页 re_path('detail/(?P<art_id>[0-9]+)', views.article_content, name="detail"), # 'detail/(?P<art_id>[0-9]+)' 页面路由指向的art_id(0-9,>=9) # views.article_content view页面 # name="detail" 别名 # 新建文章页面 re_path('edit/(?P<art_id>[0-9]+)', views.article_edit, name="edit"), # edit_action路由 path('edit_action/', views.edit_action, name="edit_action"), re_path('ArtDel/(?P<art_id>[0-9]+)', views.article_delete, name="article_delete") ]
在templates下创建html文件
主页html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>欢迎来到我的博客</title> </head> <body> <h1> 博客内容如下: </h1> <br> <br> {% for art in articles %} <a style="text-decoration: none" href="{% url 'blog:detail' art.id %}"><h2>{{ forloop.counter }} {{ art.title }}</h2></a> {# style="text-decoration: none" 文字样式:去交下划线 #} {# href="{% url 'blog:detail' art.id %}" 访问页面 传进来 三项参数(url , "命名空间:别名" , art_id参数) #} {# {{ forloop.counter }} {{ art.title }} forloop迭代器.counter遍历次数->每个文章前显示标号(自动递增) #} {% endfor %} <br> <br> <br> <a href="{% url 'blog:edit' 0 %}"><h1>发布新文章</h1></a> </body> </html>
文章内容context html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文章详情页</title> </head> <body> <h1>{{ art.title }}</h1> <h2>{{ art.content }}</h2> <h3>作者: {{ art.author }}</h3> <h3>文章分类:{{ art.articleTag }}</h3> <br> <br> <br> <a href="{% url 'blog:edit' art.id %}">修改文章</a> <a href="{% url 'blog:article_delete' art.id %}">删除文章</a> <a href="{% url 'blog:index' %}"><h2>返回主页</h2></a> </body> </html>
edit修改和新建 文章 html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>发布新文章页面</title> </head> <body> {# 由表单实现#} <form action="{% url "blog:edit_action" %}" method="post"> {# action 响应点击按钮 , method 响应方式#} {% csrf_token %} {# 安全机制,写这个防止跨站保护#} <label><h3>文章标题:</h3></label> <input type="text" name="title" {% if art %}value="{{ art.title }}{% endif %}"> {# 输入#} <br> <br> <br> <label><h3>文章内容 :</h3></label> <input type="text" name="content" {% if art %}value="{{ art.content }}{% endif %}"> <br> <br> <br> <label><h3>作者 :</h3></label> <input type="text" name="author" {% if art %}value="{{ art.author }}{% endif %}"> <br> <br> <br> <label><h3>文章分类 :</h3></label> <input type="text" name="articleTag" {% if art %}value="{{ art.articleTag }} {% endif %}"> <input type="hidden" value="{{ art.id | default:'0'}}" name="art_id"> {# 隐藏输入框判断是修改文章还是新建文章#} <br> <br> <br> <input type="submit" value="提交保存"> {# 按钮#} </form> <a href="{% url 'blog:index' %}"><h2>返回主页</h2></a> </body> </html>
article_delete 删除文章页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>删除文章</title> </head> <body> <form action="{% url "blog:article_delete" %}" method="post"> {% csrf_token %} <input type="submit" value="删除文章"> </form> <a href="{% url 'blog:index' %}"><h2>返回主页</h2></a> </body> </html>
-
admin用户管理设置文章过滤器,可以对文章进行筛选
index/admin.py
from django.contrib import admin from .models import Article class ArticleAdmin(admin.ModelAdmin): list_display = ['id', 'title', 'content', 'pub_time', 'author', 'articleTag'] list_filter = ('title', 'pub_time', 'articleTag',) # Register your models here. admin.site.register(Article, ArticleAdmin)