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> <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