django搭建个人博客实战 附github源码

django搭建个人博客实战

文章已发表在个人博客,欢迎点击这里访问

网上看了许多博主的分享,虽然不是手把手教,但是这样子从零到一,自己找轮子、齿轮,最终跑起来,整个学习的过程我觉得更有效。现在我也来回馈一下写篇小教程,个人博客上线后,拿这篇博文作为开篇也是别有番意义。

github

效果图封面

运行环境(Runtime environment)

python3.7,django2,win10

关键词(Key words)

mysql,markdown,prism,ckeditor

在pythonanywhere部署(deploy on Pythonanywhere):http://captxiong.pythonanywhere.com/

避免踩坑小TIP
  • 强烈建议编辑器用pycharm,博主一开始做其他项目都用的vs,小坑自己填,直到做了web发现有些坑填不上,换了pycharm坑都不见了。
  • 注意项目文件结构图,下面会讲,自己对应上,不然bug怎么都调不通。
  • 这里不专门搞前端,html套用模板得自己理解了,博主很多bug在html文件上。
开始创建项目

项目根目录下,在cmd窗口开始敲:

django-admin.py startproject myblog

注意项目结构,templates文件夹自己创建一下,templates/post下面存放html,static下面存放静态文件(css、img、js等),此时你还没有post文件夹,别急。

在有manage.py的文件目录下,输入python manage.py runserver,浏览器输入http://127.0.0.1:8000/,会进入调试网页界面。

下面进行数据库连接、迁移,我用的mysql,其实小型博客用自带的sqlite也可以。

在mysql命令窗口输入create database MySite CHARACTER SET utf8 COLLATE utf8_general_ci;,建议下载个可视化的软件例如navicat,看着友好点,增改删查也方便。

回到你的django项目里,setting中修改database部分如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  'mysite',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

在init文件中添加:

import pymysql
pymysql.install_as_MySQLdb()

init文件属于初始化部分,pymysql是python和mysql的连接包,需要另外安装的,database这里设置的用户名密码和name都自己看着改一下。

然后就可以在cmd窗口下输入python manage.py makemigrations,python manage.py migrate,进行数据迁移,后面只要进行startapp操作后都记得输入这两个命令。

现在创建管理员账户,python manage.py createsuperuser,可以登陆http://127.0.0.1:8000/admin进行后台管理了。

接着创建你的博客app,python manage.py startapp post,现在你的结构图应该和前面的差不多了,根目录下的templates估计还没有得自己建立。

项目核心部分

django框架几个重要部分,model.py views.py urls.py,这仨文件应该是核心之首,连接后端与前端的部分。

这里先编辑post下面的admin文件:

class PostAdmin(admin.ModelAdmin):
    list_display = ('title','category','body','excerpt')

admin.site.register(Category,CategoryAdmin)
admin.site.register(Tag,TagAdmin)
admin.site.register(Post,PostAdmin)

这里让你的管理员后台可以进行post(发表博文)、category(分类)等动作了,管理员终于不是摆设了。

然后记得编辑setting文件,INSTALLED_APPS部分加上post,这是你新建的app记得吧。

编辑model文件:

class Category(models.Model):
    """分类"""
    name = models.CharField(max_length=100)
class Tag(models.Model):
    """标签"""
    name = models.CharField(max_length=100)
class Post(models.Model):
    """文章"""
    objects = models.Manager()
    title = models.CharField(max_length=100)
    body = RichTextField('正文')
    created_time = models.DateTimeField()
    modified_time = models.DateTimeField()
    excerpt = models.CharField(max_length=200, blank=True)  # 文章摘要,可为空
    category = models.ForeignKey("Category", on_delete=True)  # ForeignKey表示1对多(多个post对应1个category)
    tags = models.ManyToManyField(Tag, blank=True)
    views = models.PositiveIntegerField(default=0)  # 阅读量

这里的body即正文部分用的RichText,富文本编辑插件,让你编辑博文比较方便。我习惯用线下markdown编辑器,码好字直接粘贴上来就好。富文本编辑器在ckeditor包里,安装后在开始输入from ckeditor.fields import RichTextField即可使用。

现在有了模型,可以进行连接工作了,将后端架构映射到前台去。

根目录下的urls文件:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('post.urls',namespace='post'))
    ]

这里加上namespace方便后面调用。

post目录下的urls文件:

urlpatterns = [
    path('', views.index,name='index'),
    path('blog/',views.blog,name='blog'),
    # url(r'^detail/post-(?P<pk>\d+)$', views.detail, name="detail"),
    path('detail-<pk>', views.detail, name="detail")
]

index为你的首页,一般博客首页就是列表了,由于我这里首页做了个封面,所以blog部分才是博客列表,后面detail为博客详情,这里path后面第一部分决定了你的链接地址形式,第二部分开始views部分。

post目录下views文件:

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

def blog(request):
    post = Post.objects.all()
    
    return render(request, template_name='blog.html',context=context)

def detail(request,pk):
    post = Post.objects.get(id=pk)
  
    post.body = markdown.markdown(post.body,
            extensions=[
            'markdown.extensions.extra',
            'markdown.extensions.codehilite',
           ])
    context ={"post":post}
    return render(request, template_name='post/work.html', context=context)

这里template_name后面接的项目文件地址,blog函数部分忘记加post/,所以程序从base_dir中查找对应文件,setting文件中templates部分设置是'DIRS': [os.path.join(BASE_DIR,'templates'),所以这里直接在post里新建了一个templates文件夹存放blog.html,其实更合理的应该是放在各个app下面,大家理解就好。

这里正文部分用了markdown,高亮部分用的prism.js,高亮部分方法比较多,然而也容易出bug。

如果不显示高亮,首先确保你的md语法没问题,建议这里用markdown编辑器写好后用html形式粘贴进来发表博文,然后可以尝试其他高亮插件。

然后说下html部分吧,也是最容易出bug的部分了,虽然不是重点,但也不能不管。首先可以自己去下载一套前端模板。

博客列表blog.html的部分:

{% for post in post_list %}
                    <div class="col-sm-4">
                      <a href="{% url 'post:detail' post.id%}" title="" class="black-image-project-hover">
                        <img src="{% static 'post/image/work01-hover.jpg' %}" alt="" class="img-responsive">
                      </a>
                      <div class="card-container card-container-lg">
                        <h3>{{ post.title }}</h3>
                        <p>{{ post.excerpt }}</p>
                        <a href="{% url 'post:detail' post.id%}" title="" class="btn btn-default">Discover</a>
                      </div>
                    </div>
{% endfor %}

用了for循环遍历了一遍你所有文章,博客列表就出来了。

博客详情detail部分:

<h1>{{ post.title }}</h1>
</div>
<p>分类:  {{ post.category.name}}</p>
<font size=5>{{ post.body|safe}}</font>

post.body后面加上safe,确保详情页有高亮显示。

关于static静态文件引用,举一例html文件的引用:

<script type="text/javascript" src="{% static 'post/js/prism.js' %}"></script>

根据static文件夹位置进行设置,同时在setting文件中记得添加根目录地址,html最前面记得加上{% load staticfiles %}

这一块根据自己的模板文件进行调整了,具体可以参考我的源码。

部署上线闲聊

为啥说闲聊,因为这里就不具体说上线步骤了,网上还是挺多教程,有需要后面可以单独写一篇。
一开始准备租个云服务器玩玩,然而尝试了腾讯、阿里的免费试用,到底是免费的,配置太低非常卡,博主暂时也没啥(人)需(民)要(币),就在pythonanywhere上部署了,pw缺点是大陆地区访问速度很慢,域名不独立。

从头安装、配置虚拟环境真的太需要耐心,后面有需要了再砸钱弄个中高配的服务器,以“从一而终”心态安装、配置吧。

结尾

文章写得比较粗糙,许多地方还需要各位自己动手搜搜,我踩过坑的地方着重写了,希望能帮到有需要的朋友。

最后感谢各位大佬的分享教学!

在这里插入图片描述

在这里插入图片描述

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值