真实生活与工作的成长日记

Python(五十三)博客网站小案例

2022-02-05  本文已影响0人  Lonelyroots

从2021年9月2日发文至今,Python系列(包括代码在内)共计100448个字、五十三篇!

新年快乐,近期因为新年,所以漏更了几天,这一篇也是给大家带来一个网站、pycharm与MySQL数据库的联动小案例。

如果Run manage.py Task...出了问题


可以到虚拟机的相应位置,输入python manage.py runserver,如下图所示。

Myblog15_16/init.py:

import pymysql
pymysql.install_as_MySQLdb()

blog/models.py:

from django.db import models

# Create your models here.

class BlogModel(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
写好模型类以后,先进行映射,然后再提交映射文件。

templates/blog/blog_base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}模板的母版文件{% endblock %}</title>
</head>
<body>
{% block body %}

{% endblock %}
</body>
</html>

templates/blog/blog_index.html:

{% extends 'blog/blog_base.html' %}

{% block title %}
    博客首页
{% endblock %}

{% block body %}
    <p><a href="{% url 'blog_add' %}">添加博客</a></p>
    <p><a href="{% url 'blog_list' %}">博客列表</a></p>
{% endblock %}

templates/blog/blog_add.html:

{% extends 'blog/blog_base.html' %}

{% block title %}
    添加博客
{% endblock %}

{% block body %}
    <h1>添加新博客</h1>
    <form action="{% url 'blog_add' %}" method="post">
        {#  csrf_token防止跨域请求  #}
        {% csrf_token %}
        标题 <input type="text" id="title" name="title" placeholder="请输入文章标题"><br>
        内容 <textarea name="content" id="content" cols="30" rows="10" placeholder="请输入文章内容"></textarea> {# textarea:文本域 #}
        <button type="submit">发布文章</button>
    </form>      {# 渲染页面用get方式,提交数据用post方式 #}
    <br>
    <a href="{% url 'blog_index' %}">返回首页</a>
{% endblock %}

templates/blog/blog_list.html:

{% extends 'blog/blog_base.html' %}

{% block title %}
    博客显示
{% endblock %}

{% block body %}
    <h1>靓文展示页</h1>
    <table>
        <tr>
            <th width="80px">标题</th>
            <th>功能</th>
        </tr>
        {% for b in b_list %}
            <tr>
                <td style="text-align: center"><a href="{% url 'blog_detail' b.id %}">{{ b.title }}</a></td>
                <td><a href="{% url 'blog_edit' b.id %}">编辑</a>&emsp;<a href="{% url 'blog_delete' b.id %}">删除</a></td>
            </tr>
        {% endfor %}
    </table>
    <br>
    <a href="{% url 'blog_index' %}">返回首页</a>
{% endblock %}

templates/blog/blog_detail.html:

{% extends 'blog/blog_base.html' %}

{% block title %}
    文章详情
{% endblock %}

{% block body %}
    <h1>{{ blog.title }}</h1>
    {{ blog.content }}
    <br>
    <br>
    <a href="{% url 'blog_list' %}">返回列表页</a>
{% endblock %}

templates/blog/blog_edit.html:

{% extends 'blog/blog_base.html' %}

{% block title %}
    修改博客
{% endblock %}

{% block body %}
    <h1>修改博客</h1>
    <form action="{% url 'blog_edit' blog.id %}" method="post">            {# 当不填写action提交路径时,默认提交到当前路径,所以这里写不写action都是可以的 #}
        {#  csrf_token防止跨域请求  #}
        {% csrf_token %}
        新标题:<input type="text" id="new_title" name="new_title" value="{{ blog.title }}"><br>
        新内容:<textarea name="new_content" id="new_content" cols="20" rows="10">{{ blog.content }}</textarea>
        <button type="submit">确认修改</button>
    </form>
    <br>
    <a href="{% url 'blog_list' %}">返回列表页</a>
{% endblock %}

blog/views.py:

from django.shortcuts import render
from .models import BlogModel
from django.http import HttpResponse
from django.shortcuts import redirect,reverse       # 重定向需导入模块

# Create your views here.

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

def blog_add(request):
    # 如果是get请求,那就是访问页面
    if request.method == 'GET':
        return render(request,'blog/blog_add.html')
    # 如果是post请求,那就是向页面提交数据
    elif request.method == 'POST':
        # 获取文章标题
        title = request.POST.get('title')       # 这里的title需要和前端页面blog_add里的标题input中的name值保持一致.
        # 获取文章内容
        content = request.POST.get('content')       # 这里的content需要和前端页面blog_add里的内容input中的name值保持一致.
        # 将数据保存到数据库中
        BlogModel.objects.get_or_create(title=title,content=content)
        b_list = BlogModel.objects.all()        # 查询所有文章
        # 文章添加成功后,要转到文章列表页,展示所有文章.
        return render(request,'blog/blog_list.html',context={'b_list':b_list})

def blog_list(request):
    b_list = BlogModel.objects.all()  # 查询所有文章
    return render(request,'blog/blog_list.html', context={'b_list': b_list})

# 通过blog_id确定具体查看的是哪篇文章。
def blog_detail(request,blog_id):
    blog = BlogModel.objects.get(id=blog_id)
    return render(request,'blog/blog_detail.html',context={'blog':blog})

def blog_edit(request,blog_id):
    blog = BlogModel.objects.get(id=blog_id)
    if request.method == 'GET':
        return render(request,'blog/blog_edit.html',context={'blog':blog})      # 将原内容写入
    elif request.method == 'POST':
        # 获取文章标题
        new_title = request.POST.get('new_title')  # 这里的new_title需要和前端页面blog_edit里的标题input中的name值保持一致.
        # 获取文章内容
        new_content = request.POST.get('new_content')  # 这里的new_content需要和前端页面blog_edit里的内容input中的name值保持一致.
        BlogModel.objects.filter(id=blog_id).update(title=new_title,content=new_content)  # 这里的红变量名是数据库中的字段名称
        # 文章修改成功后,要转到文章列表页,展示所有文章.
        return redirect(reverse('blog_list'))

# 通过blog_id确定具体需要删除的是哪篇文章
def blog_delete(request,blog_id):
    blog = BlogModel.objects.filter(id=blog_id)
    # 如果有当前这篇文章就删除
    if blog:
        blog.delete()
        return redirect(reverse('blog_list'))       # 'blog_list'即需要重定向的路由name值.
    else:
        return HttpResponse('该文章不存在')

Myblog15_16/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('index/',views.index,name='blog_index'),
    path('add/',views.blog_add,name='blog_add'),
    path('list/',views.blog_list,name='blog_list'),
    path('detail/<blog_id>/',views.blog_detail,name='blog_detail'),
    path('edit/<blog_id>/',views.blog_edit,name='blog_edit'),
    path('delete/<blog_id>/',views.blog_delete,name='blog_delete'),
]

运行结果:



......
然后带大家到MySQL数据库里看看:


文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!

Editor:Lonelyroots

上一篇下一篇

猜你喜欢

热点阅读