美文网首页真实生活与工作的成长日记
Python(五十三)博客网站小案例

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

作者: Lonelyroots | 来源:发表于2022-02-05 23:13 被阅读0次

    从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

    相关文章

      网友评论

        本文标题:Python(五十三)博客网站小案例

        本文链接:https://www.haomeiwen.com/subject/yabykrtx.html