Django模板 实现简易博客功能项目

  • 创建项目

使用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)

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值