在上一篇中,咱们已经实现了Scrapy框架爬取数据,并且存储到Mongodb数据库,
接下来呢,,,,,,,,,,,,,
咱们就要对这些数据进行操作。

目标:从Mongodb数据库取出数据,通过Django框架展示到web页面,实现展示、分页、添加、修改、删除的功能

1. 准备工作

创建django项目
点击:file–>new project,出现下面的对话框。

选择Django栏目,输入项目名称,选择python解释器版本,点击create创建。

创建APP
在pycharm下方的terminal终端中输入命令:

  python manage.py startapp cmdb

这样就创建了一个叫做cmdb的APP,django自动生成“cmdb”文件夹。

具体详见django新手教程

2. 连接mongodb数据库(cmdb/models.py)


from django.db import models
from mongoengine import * # Create your models here. # 指明要连接的数据库
connect('Complaint',host = '127.0.0.1',port = 27017) class invitation(Document):
# 定义数据库中的所有字段
number = StringField()
title = StringField()
content = StringField()
url = StringField() # 指明连接的数据表名
meta = {'collection':'invitation'} # 测试是否连接成功
# for i in invitation.objects[:10]:
# print(i.title)

3. 配置相关设置(ComplaintDjango/settings.py)


"""
Django settings for ComplaintDjango project. Generated by 'django-admin startproject' using Django 2.0.5. For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/ For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
""" import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '4c-=!&(4kx9xhrz=e1%((vx#!*v%2pbot$2sss7k6*c$yw@t*e' # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
] MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# csrf跨站请求保护机制,暂时先关闭,或者在form表单里添加一个`{% csrf_token %}`标签。
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] ROOT_URLCONF = 'ComplaintDjango.urls' TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 配置html
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
] WSGI_APPLICATION = 'ComplaintDjango.wsgi.application' # Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases DATABASES = {
'default': {
'ENGINE': None,
}
}
# 连接mongodb数据库
from mongoengine import connect
connect('Complaint') # Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
] # Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/'
# 配置静态文件
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)

4. 路由(ComplaintDjango/urls.py)

路由都在urls文件里,它将浏览器输入的path映射到相应的业务处理逻辑。

简单编写方法如下:


from django.contrib import admin
from django.urls import path
# 导入对应 app 的 views 文件
from cmdb import views urlpatterns = [
# 首页,展示页面
path('index/',views.index),
# 跳转到添加页面
path('toAdd/',views.toAdd),
# 添加到数据库
path('addInvitation/',views.addInvitation),
# 跳转到修改页面,进行数据回显
path('toUpdate/',views.toUpdate),
# 修改数据
path('updateInvitation/',views.updateInvitation),
# 删除数据
path('delete/',views.delete)
]

5.业务处理逻辑(cmdb/views.py)

业务处理逻辑都在views.py文件里。


from django.shortcuts import render
from cmdb.models import invitation
from django.core.paginator import Paginator # 分页
from django.http import HttpResponseRedirect
# Create your views here. # 展示、分页
def index(request):
# 限制每一页显示的条目数量
limit = 10
# 查询所有的数据
article = invitation.objects
paginator = Paginator(article,limit)
# 从url中获取页码参数
page_num = request.GET.get('page',1)
loaded = paginator.page(page_num)
context = {
'invitation':loaded
}
return render(request,"index.html",context) # 进入添加页面
def toAdd(request):
return render(request,"add.html") # 添加
def addInvitation(request):
if request.method == 'POST':
number = request.POST.get("number",None)
title = request.POST.get("title",None)
content = request.POST.get("content",None)
url = request.POST.get("url",None)
tit = "提问:" + str(title) + " 编号:" + str(number)
# 添加到数据库
invi = invitation(number = number,title = tit,content = content,url = url)
invi.save()
return HttpResponseRedirect('/index/') # 回显
def toUpdate(request):
if request.method == 'GET':
number = request.GET.get("number",None)
# 根据条件查询数据
invi = invitation.objects.filter(number=number)
context = {
'invitation':invi
}
return render(request,"update.html",context) # 修改
def updateInvitation(request):
if request.method == 'POST':
number = request.POST.get("number", None)
title = request.POST.get("title", None)
content = request.POST.get("content", None)
url = request.POST.get("url", None)
# 根据条件修改数据
invi = invitation.objects.filter(number=number).update(title=title,content=content,url=url)
return HttpResponseRedirect('/index/') # 删除
def delete(requeset):
if requeset.method == 'GET':
number = requeset.GET.get("number",None)
# 删除数据
invi = invitation.objects.filter(number=number).delete()
return HttpResponseRedirect('/index/')

6.Html页面

首页(templates/index.html)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<script type="text/javascript" src="static/js/jquery-1.8.2.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/index_work.css">
<body>
<a href="/toAdd/">添加</a>
<table>
<thead>
<th>编号</th>
<th>标题</th>
<th>内容</th>
<th>链接</th>
<th>操作</th>
</thead>
<tbody>
{% for item in invitation %}
<tr>
<td>{{ item.number }}</td>
<td>{{ item.title }}</td>
<td>{{ item.content }}</td>
<td><a>{{ item.url }}</a></td>
<td>
<a href="/toUpdate/?number={{ item.number }}"><input type="button" value="修改"></a>
<a href="/delete/?number={{ item.number }}"><input type="button" value="删除"></a>
</td>
</tr>
{% endfor %}
<tr>
<th colspan="6">
{% if invitation.has_previous %}
<a href="?page={{ invitation.previous_page_number }}"><input type="button" value="上一页"></a>
{% endif %}
<span>{{ invitation.number }} of {{ invitation.paginator.num_pages }}</span>
{% if invitation.has_next %}
<a href="?page={{ invitation.next_page_number }}"><input type="button" value="下一页"></a>
{% endif %}
</th>
</tr>
</tbody>
</table>
</body>
</html>


添加页面(templates/add.html)


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加帖子</title>
</head>
<script type="text/javascript" src="static/js/jquery-1.8.2.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/index_work.css">
<body>
<form action="/addInvitation/" method="post">
编号:<input type="text" name="number" style="width: 500px"><br>
标题:<input type="text" name="title" style="width: 500px"><br>
内容:<br><textarea name="content" style="width: 550px;height: 200px"></textarea><br>
链接:<input type="text" name="url" style="width: 500px"><br>
<input type="submit" value="发布">
</form>
</body>
</html>


修改页面(templates/update.html)


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改</title>
</head>
<script type="text/javascript" src="static/js/jquery-1.8.2.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/index_work.css">
<body>
<form action="/updateInvitation/" method="post">
{% for i in invitation %}
编号:<input type="text" name="number" value="{{ i.number }}" style="width: 500px" readonly="true"><br>
标题:<input type="text" name="title" value="{{ i.title }} " style="width: 500px"><br>
内容:<br><textarea name="content" style="width: 550px;height: 200px">{{ i.content }}</textarea><br>
链接:<input type="text" name="url" value="{{ i.url }}" style="width: 500px"><br>
<input type="submit" value="确认修改">
{% endfor %}
</form>
</body>
</html>

注意:修改是先回显后改的过程,回显时,对 number 设置为 readonly = “true”,千万不要设置为 disabled = “true” ,最重要的一点原因:当表单提交时,这个表单输入项将不会被提交。

更多见:

https://blog.csdn.net/qq_41139341/article/details/81667082?tdsourcetag=s_pcqq_aiomsg

https://www.cnblogs.com/wuzaipei/p/9966190.html

基于Django框架对MongoDB实现增删改查的更多相关文章

  1. golang学习之beego框架配合easyui实现增删改查及图片上传

    golang学习之beego框架配合easyui实现增删改查及图片上传 demo目录: upload文件夹主要放置上传的头像文件,main是主文件,所有效果如下: 主页面: 具体代码: <!DO ...

  2. python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)

    一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...

  3. Django之model基础(增删改查)

    一.ORM 映射关系 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象二.创建表(建立模型) 在创建表之前的准备 ...

  4. Java连接MongoDB进行增删改查

    1.导入必须的包: 详情看项目:http://pan.baidu.com/s/1cvDAOY 2.通过Myeclipse创建WEB项目 3. 3.bean:创建实体类 package com.bean ...

  5. Django 自带的ORM增删改查

     通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...

  6. MongoDB的增删改查 转

    MongoDB的增删改查 (黎明你好原创作品,转载请注明) MongoDB中数据的基本单元叫做文档,采用json的键-值的方式.多个键及其关联的值有序的存放在一起变是文档.类似于编程语言中的键值关系. ...

  7. Java实现mongodb原生增删改查语句

    Java实现mongodb原生增删改查语句 2018-03-16 自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb 结构 代码 0 pom.xml < ...

  8. Scala对MongoDB的增删改查操作

    =========================================== 原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! ==================== ...

  9. C# 对MongoDB 进行增删改查的简单操作

    C# 对MongoDB 进行增删改查的简单操作   下面演示下C#操作MongoDB驱动的简单的增删改查代码 运用到的MongoDB支持的C#驱动,当前版本为1.6.0 1,连接数据库   /// & ...

随机推荐

  1. bzoj3238 差异

    题目链接 思路 观察题目中的式子,可以发现前两项是定值.所以只需要求出最后一项就行了. 然后题目就转化为了求字符串中所有后缀的\(lcp\)长度之和. 可以想到用后缀数组.在后缀数组上两个后缀的\(l ...

  2. Overloaded Fuction 调用——到底使用的是谁的函数

    #include <stdio.h> class Base{ public: int a(){ ; } }; class Inherit:public Base{ public: int ...

  3. poj 2229 Sumsets(记录结果再利用的DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 将一个数N分解为2的幂之和共有几种分法? 题解: 定义dp[ i ]为数 i 的 ...

  4. springmvc 学习笔记

    @Autowired,@RequestMapping,@RequestParam 使用该注解,引入对象时, 可以省略setter getter.减少代码显示. @AutowiredSimService ...

  5. vbox的桥接网络

    直接连接到了外网上,宿主机可以访问虚拟机,但是虚拟机不可以访问宿主机.缺点:宿主机没有网络时,将不能ping通. 宿主机:win10 网络:无线 虚拟机系统:centos6.5 vbox版本:6.0. ...

  6. Java基础构造方法和this关键字整理

    构造方法 8.1构造方法介绍 构造方法的格式: 修饰符 构造方法名(参数列表) { } l  构造方法的体现: n  构造方法没有返回值类型.也不需要写返回值.因为它是为构建对象的,对象创建完,方法就 ...

  7. python3 rrdtool 使用

    源自 python自动化运维:技术与最佳实践 并做略微修改 安装 yum install python-rrdtoolyum install rrdtool-devel #因为采集用了psutil模块 ...

  8. MapReduce框架原理-MapTask工作机制

    MapReduce框架原理-MapTask工作机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速 ...

  9. layui(六)——upload组件常见用法总结

    layui中提供了非常简单的文件上传组件,这里写了一个上传图片的栗子,上传成功后返回图片在服务器的路径,并设置为页面中img的src属性.因为上传十分简单,没什么可说的,就直接上代码了. html代码 ...

  10. Linux环境变量总结

    现在每天测试到时候会与Linux打交道,自然也会用到环境变量了.看了网上几篇文章,结合自己到实践和看法,总结以下Linux的环境变量吧.一.什么是环境变量?环境变量相当于给系统或用户应用程序设置的一些 ...