首先在setting.py文件中编写数据库配置内容

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'site',
'USER': 'user',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '',
}
}

之后在app中models.py文件编写模型映射表

from django.db import models

# Create your models here.

class BlogModle2(models.Model):
title = models.CharField(max_length=50)  # 标题
content = models.TextField()        # 内容 def __str__(self):
return f'title={self.title}, content={self.content}'

通过pycham的控制台输入

makemigrations appname
migrate appname

创建数据库中的表

之后进行模版渲染,在app中views.py中编写index, add, list, detail, edit这五个函数

index

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
from .models import BlogModle2
# Create your views here. def blog_index(request): # 主页函数
return render(request, 'blog/demo_index.html') # 渲染index页面
{% extends 'blog/demo_base.html' %}

{% block title %}
首页
{% endblock %} {% block bodyblock %}
<tr>
<td><a href="{% url 'blog_add' %}">添加文章</a></td>
<td><a href="{% url 'blog_list' %}">文章列表</a></td>
</tr>
{% endblock %}

add

def blog_add(request):                                  # 添加页面
if request.method == 'GET': # 如果请求为get请求
return render(request, 'blog/demo_add.html') # 渲染 add 页面
elif request.method == 'POST': # 如果请求为post页面
title = request.POST.get('title') # 获取form表单填写的标题
content = request.POST.get('content') # 获取form表单填写的内容
blog = BlogModle2(title=title, content=content) # 数据库写入
blog.save()
return render(request, 'blog/demo_add.html') # 渲染add页面
{% extends 'blog/demo_base.html' %}
{% block title %}
添加博客
{% endblock %}
{% block bodyblock %}
<h1>添加新文章</h1>
<form action="" method="POST">
{% csrf_token %} {# 防止跨域攻击与请求 #}
{# <form action="" method="GET"> {% csrf_token %}#}
标题<input type="text" autocomplete="off" id="title"
placeholder="请输入标题" name='title' value="{{ blog.title }}"> <br> <br><br>
内容 <textarea name="content" id="content"
placeholder="请输入内容" cols="30" rows="10">{{ blog.content }}</textarea>
<button type="submit">发布博客</button>
</form>
{% endblock %}

list

def blog_list(request):                                 # 列表页面
blog_list = BlogModle2.objects.all() # 获取数据库表中所有内容
return render(request, 'blog/demo_list.html', context={'blog_list': blog_list}) # 传递blog_list内容,渲染list页面
{% extends 'blog/demo_base.html' %}
{% block title %}
文章列表
{% endblock %} {% block bodyblock %}
<h1 style="margin-left: 100px">文章列表</h1>
<table width="400px">
<thead style="font-size:20px">
<tr>
<th>标题</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for blog in blog_list %}
<tr>
<th><a href="{% url 'blog_detail' blog.id %}">{{ blog.title }}</a></th>
<th><a href="{% url 'blog_edit' blog.id %}">编辑</a> | <a href="{% url 'blog_delete' blog.id %}">删除 </a></th>
</tr>
{% endfor %}
</tbody>
</table> {% endblock %}

detail

def blog_detail(request, blog_id):                      # 详情页面
blog = BlogModle2.objects.get(id=blog_id) # 获取选中数据库表中标题那条数据
return render(request, 'blog/demo_detail.html', context={'blog': blog}) # 渲染detail页面
{% extends 'blog/demo_base.html' %}
{% block title %}
文章详情
{% endblock %}
{% block bodyblock %}
<h1>{{ blog.title }}</h1>
{{ blog.content }}
{% endblock %}

delete

def blog_delete(request, blog_id):                      # 删除功能
blog = BlogModle2.objects.get(id=blog_id) # 获取选中数据库表中标题那条数据
if blog: # 如果存在
blog.delete() # 删除
return redirect(reverse('blog_list')) # 返回列表页面
else:
return HttpResponse('不存在这条博客')

edit

def blog_edit(request, blog_id):                    # 编辑
blog = BlogModle2.objects.get(id=blog_id) # 获取选中数据库中数据
if request.method == 'GET': # 如果是GET请求
return render(request, 'blog/demo_add.html', context={'blog': blog}) # 渲染add页面,自动填入获取内容
elif request.method == 'POST': # 如果是post请求
blog.title = request.POST.get('title') # 标题修改
blog.content = request.POST.get('content') # 内容修改
blog.save()
return redirect(reverse('blog_list')) # 重定向到list页面

urls.py

from django.urls import path, re_path
from . import views urlpatterns = [
path('index/', views.blog_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('delete/<blog_id>', views.blog_delete, name='blog_delete'),
path('edit/<blog_id>', views.blog_edit, name='blog_edit'),
]

base.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>
</head>
<body>
{% block bodyblock %} {% endblock %} </body>
</html>

小白学习django第五站-简易案例的更多相关文章

  1. 小白学习django第六站-http相关

    请求与相应 HttpRequest对象API def home(request): print('path:', request.path) print('mothod:', request.meth ...

  2. 小白学习django第四站-关联数据库

    使用mysql连接django首先要配置好相关环境 首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库) 在setting.py那个目录的__init__.py文件中写入 之 ...

  3. 小白学习django第三站-自定义过滤器及标签

    要使用自定义过滤器和标签,首先要设置好目录结构 现在项目目录下建立common的python包 再将common加入到setting.py中的INSTALLED_APP列表中 在common创建目录t ...

  4. 小白学习django第一站-环境配置

    Django简单来说就是用Python开发的一个免费开源的Web框架 使用Django,使你能够以最小的代价构建和维护高质量的Web应用. 开搞!!! 工具准备: linux(ubuntu) + py ...

  5. 小白学习django第二站-模版配置

    上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...

  6. 小白学习Spark系列五:scala解析多级json格式字符串

    一.背景 处理json格式的字符串,key值一定为String类型,但value不确定是什么类型,也可能嵌套json字符串,以下是使用 JSON.parseFull 来解析多层json. 二.实例代码 ...

  7. 小白学习tornado框架第一站-环境设置

    首先建立一个虚拟环境 mkvirtualenv -p /usr/bin/python3 tornado_1 安装tornado框架 pip install tornado  pycham中建立同步 创 ...

  8. 小白学习vue第五天-第二弹(全局局部、父子、注册语法糖,script/template抽离模板)

    全局组件: 就是注册的位置在实例对象的外面 并且可以多个实例对象使用 而局部: 就是在实例对象的内部注册 父组件和子组件的关系 子组件就是在另一个组件里面注册的组件 组件注册语法糖: 就不用Vue.e ...

  9. 小白学习vue第五天(理解使用组件开发,组件第一弹)

    组件怎么从创建到使用? 第一步创建组件构造器对象 感觉个人理解就是创建一个模板,和创建MongoDB数据模板相似 const cpnC = Vue.extend({ template: ` <d ...

随机推荐

  1. Linux Shell脚本,删除旧文件,保留最新的几个文件

    删除某一目录下文件,只保留最新的几个 #!/bin/bash #保留文件数 ReservedNum= FileDir=/home/dev/saas_test/testcases/report/html ...

  2. Git本地安装

    1 Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码 ...

  3. org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found.

    1. 情景重现 1.1 Mapper 代码 public interface DeviceFileInfoVOMapper { List<QueryFileDTO> selectVideo ...

  4. Nginx 配置443 HTTPS

    server { listen 443 ssl; server_name localhost; ssl on; ssl_certificate D://newlingshou//nginx-1.12. ...

  5. 苹果应用(.ipa)打包和上传,不用通过苹果商店即可用

    签名工具: appuploader(.p12:.cer) 打包平台: http://www.lbuilder.com(收费) 上传平台: http://www.58apk.com (每日50次下载,加 ...

  6. Eclipse IDE for C/C++ Developers和MinGW安装配置C/C++开发学习环境详解

    Eclipse IDE for C/C++ Developers和MinGW安装配置C/C++开发学习环境详解 操作系统:Windows 7 JDK版本:1.6.0_33 Eclipse版本:Juno ...

  7. BFC是什么?有什么作用?

    BFC(Block Formatting Context)直译为“块级格式化范围”. 一.常见定位方案 在讲 BFC 之前,我们先来了解一下常见的定位方案,定位方案是控制元素的布局,有三种常见方案: ...

  8. Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)

    看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...

  9. pyqt5的QCompleter自动补全 使用模板

    相关说明 使用QCompleter类,就可以实现自动补全功能,效果图如下: 对应的代码很简单 def init_lineedit(self): # 增加自动补全 self.completer = QC ...

  10. Maven国内源设置

    Maven国内源设置 目前国外的maven源访问非常慢,作为一个Java开发者,是一件很痛苦的事,而国内的maven源,oschina已经关闭,目前最好的方式,就是使用阿里云的镜像: <mirr ...