Django个人博客
首先,创建一个博客项目,配置文件
① 配置静态文件与模块文件
# ⑴ 在setting的最后添加【配置静态文件】:
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"static"),
)
# ⑵ 在setting文件的58行,键为‘DIRS’添加键值
'DIRS':[
os.path.join(BASE_DIR,"templates")
]
# ⑶ 在setting文件的33行,INSTALLED_APPS 的列表中添加app名称。
# ⑷ django默认使用sqlite3数据库,使用其他数据库需要重新创建【这里使用mysql】
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #确认使用数据库类型
'NAME': "blog", # 数据库名称
'USER': "root", # 用户
"PASSWORD": "123", # 密码
"HOST": "localhost", #使用位置
"PORT": 3306 #端口
}
}
② 在mysql创建对应数据库
create database blog charset=utf8;
③ 在models里创建需要的表格
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=32)
gender = models.CharField(max_length=32)
age = models.IntegerField()
email = models.EmailField()
def __str__(self):
return self.name
class Type(models.Model):
name = models.CharField(max_length=32)
description = models.TextField()
def __str__(self):
return self.name
class Blog(models.Model): #定义数据表 类名是表名的一部分
title = models.CharField(max_length=32) #char(32)
date = models.DateField(auto_now=True) #date
content = models.TextField()
description = models.TextField()
author = models.ForeignKey(to=Author,on_delete = models.SET_DEFAULT,default=1)
#models.CASCADE 级联删除,主键删除外键对应数据删除
#models.SET_NULL 主键删除,外键设置为空,需要外键设置可以为空 null = True
#models.SET_DEFAULT 主键删除之后,外键采用默认值,需要设置默认值 default=""
type = models.ManyToManyField(to=Type)
def __str__(self):
return self.title
#django 默认创建id字段,主键,自增长
#django 所有字段默认不可以为空
# Create your models here.
④ 在admin中注册表格
from django.contrib import admin
from app.models import *
admin.site.register(Blog)
admin.site.register(Author)
admin.site.register(Type)
⑤Django 默认使用python2的mysql数据库模块,python3的pymysql模块做了容错。解决方法在初始化文件写入如下【注意:此处的初始化文件为app的初始化文件,而不是迁移记录的初始化文件。】
import pymysql
pymysql.install_as_MySQLdb()
⑥ 同步数据库
点击工具栏中的Tools的Run manage.py Task,
然后在打开的命令行中输入makemigrations,成功之后输入migrate。
⑦创建超级用户
python manage.py createsuperuser
至此,博客初级结构搭建完成。
⑧ 添加数据
url【路由】
from django.contrib import admin
from django.urls import path,re_path
from app.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', index),
path('add_data/', add_data),
]
views【视图】
# 添加数据
def add_data(request):
# 添加一百条数据
for i in range(100):
data = Blog()
data.title = "我是 老 %s"%i
data.content = "I am %s"%i
data.description = "俺是 老 %s"%i
data.author = Author.objects.get(id = 1) # id为的作者
data.save()
data.type.add(
Type.objects.get(id = 1)
) # id为1的文章类型
data.save()
return HttpResponse('save success !')
⑨分页
url【路由】
from django.contrib import admin
from django.urls import path,re_path
from app.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', index),
path('add_data/', add_data),
path('new_list/', new_list),
re_path(r'new_list/(?P<p>\d+)',new_list),
re_path(r'new/(?P<id>\d+)',new),
]
views【视图】
def new_list(request,p=1):
p = int(p)
# 按照id对数据进行降序
blogs = Blog.objects.order_by('-id')
# 将分页的总数据以及每页的条数放入分页模块
paginator = Paginator(blogs,6)
# paginator.count #总条数 100
# paginator.num_pages #总页数
# paginator.page_range #页码列表
# 获取具体页的数据
pagedata = paginator.page(p)
# page.has_next() 是否由下一页
# page.has_previous 是否由上一页
# page.has_other 是否还有数据
# 获取页码
start = p-3
end = p+2
if start<=0:
start = 0
page_range = paginator.page_range[start:end]
return render_to_response('new_list.html',locals())
html【页面】
{% extends 'base.html' %}
{% block title %}
{% endblock %}
{% block content %}
<div class="con_content">
<div class="about_box">
<h2 class="nh1"><span>您现在的位置是:<a href="/" target="_blank">网站首页</a>>><a href="#" target="_blank">个人日记</a></span><b>个人日记</b></h2>
<div class="dtxw box">
{% for article in pagedata %}
<li>
<div class="dttext f_l">
<ul>
<h2><a href="/new/{{ article.id }}/">{{ article.title }}</a></h2>
<p>{{ article.description }}</p>
<span>{{ article.date }}</span>
</ul>
</div>
<div class="xwpic f_r">
<a href="/"><img src="/static/images/02.jpg"></a>
</div>
</li>
{% endfor %}
</div>
{# <div class="pagelist">页次:1/1 每页25 总数10<a href="/">首页</a><a href="/">上一页</a><a href="/">下一页</a><a href="/">尾页</a></div>#}
<div class="pagelist">
{% for p in page_range %}
<a href="/new_list/{{ p }}/">{{ p }}</a>
{% endfor %}
</div>
</div>
</div>
{% endblock %}