Django个人博客以及分页

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 %}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值