django版博客项目

一 项目概述
项目运行环境 1 python3.6+ 2 Django 1.11 3 mysql 5.7
项目详细功能介绍
前台功能 1 项目首页展示 2 轮播图 3 博客推荐 4 最新发布 5 博客分类 6 最新评论文章 7 搜索功能 8 博客分类功能 9 博客标签查询 10 友情链接 11 博客分页
二 开发环境搭建
三 创建项目
1 进入虚拟环境创建项目

django-admin startproject django_blog

2 进入项目创建应用

python manage.py startapp userapp
python manage.py startapp blogapp

3 在settings中配置数据库

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

4 执行迁移文件

python manage.py migrate

5 创建超级管理员

python manage.py createsuperuser

四 创建数据模型
userapp

USER(用户模型)

from django.contrib.auth.models import AbstractUser

class BlogUser(AbstractUser):
nikename = models.CharField('昵称', max_length=20, default='')

注:需要在settings配置文件中设置: AUTH_USER_MODEL = 'users.BlogUser'
blogapp
Banner(轮播图模型)

class Banner(models.Model):
    title = models.CharField('标题',max_length = 50)
    cover = models.ImageField('轮播图',    upload_to='static/images/banner')
    link_url = models.URLField('图片链接', max_length=100)
    idx = models.IntegerField('索引')
    is_active = models.BooleanField('是否是active', default=False)

    def __str__(self):
        return self.title
    class Meta:
        verbose_name = '轮播图'
        verbose_name_plural = '轮播图'

Category(博客分类模型)

class BlogCategory(models.Model):
    name = models.CharField('分类名称', max_length=20, default='')
    class Meta:
        verbose_name = '博客分类'
        verbose_name_plural = '博客分类'

    def __str__(self):
    return self.name

Tags(标签模型)

class Tags(models.Model):
    name = models.CharField('标签名称', max_length=20, default='')
    class Meta:
        verbose_name = '标签'
        verbose_name_plural = '标签'

    def __str__(self):
        return self.name

Blog(博客模型)

class Post(models.Model):
    user = models.ForeignKey(BlogUser, verbose_name='作者')
    category = models.ForeignKey(BlogCategory, verbose_name='博客分类', default=None)
    tags = models.ManyToManyField(Tags, verbose_name='标签')
    title = models.CharField('标题', max_length=50)
    content = models.TextField('内容')
    pub_date = models.DateTimeField('发布日期', default=datetime.now)
    cover = models.ImageField('博客封面',  upload_to='static/images/post', default=None)
    views = models.IntegerField('浏览数', default=0)
    recommend = models.BooleanField('推荐博客', default=False)

    def __str__(self):
        return self.title
    class Meta:
        verbose_name = '博客'
        verbose_name_plural = '博客'

Comment(评论模型)

class Comment(models.Model):
    post = models.ForeignKey(Post, verbose_name='博客')
    user = models.ForeignKey(BlogUser, verbose_name='作者')
    pub_date = models.DateTimeField('发布时间')
    content = models.TextField('内容')

    def __str__(self):
        return self.content
    class Meta:
        verbose_name = '评论'
        verbose_name_plural = '评论'

FriendlyLink(友情链接模型)

class FriendlyLink(models.Model):
    title = models.CharField('标题', max_length=50)
    link = models.URLField('链接', max_length=50, default='')

    def __str__(self):
        return self.title
    class Meta:
        verbose_name = '友情链接'
        verbose_name_plural = '友情链接'

五、实现首页页面模板创建模板文件夹
创建模板文件templates,并在settings.py中设置

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'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',
],
},
},
]

配置静态文件路径

STATIC_URL = '/static/'

STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)

六、创建首页路由
创建视图函数

def index(request):
    return render(request, 'index.html', {})
  • 配置url
url(r'^index/$', index, name='index' )

七、实现幻灯片功能(Banner)
注册模型

from blogs.models import Banner
admin.site.register(Banner)

编写views

from .models import Banner

def index(request):
    banner_list = Banner.objects.all()
    ctx = {
    'banner_list': banner_list,
}
    return render(request, 'index.html', ctx)

模板

<!-- banner 开始 -->
<div id="focusslide" class="carousel slide" data-ride="carousel">
    <ol class="carousel-indicators">

{% for banner in banner_list %}
{% if banner.is_active %}
     <li data-target="#focusslide" data-slide-to="{{banner.idx}}" class="active"></li>
{% else %}
     <li data-target="#focusslide" data-slide-to="{{banner.idx}}"></li>
{% endif %}
{% endfor %}

    </ol>
    <div class="carousel-inner" role="listbox">

{% for banner in banner_list %}
{% if banner.is_active %}
<div class="item active">
<a href="{{banner.link_url}}" target="_blank" title="{{banner.title}}" >
<img src="{{banner.cover}}" alt="{{banner.title}}" class="img-responsive"></a>
</div>
{% else %}
<div class="item">
<a href="{{banner.link_url}}" target="_blank" title="{{banner.title}}" >
<img src="{{banner.cover}}" alt="{{banner.title}}" class="img-responsive"></a>
</div>
{% endif %}
{% endfor %}

    </div>
    <a class="left carousel-control" href="#focusslide" role="button" data-slide="prev" rel="nofollow">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">上一个</span> </a>
<a class="right carousel-control" href="#focusslide" role="button" data-slide="next" rel="nofollow">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">下一个</span> </a>
</div>

<!-- banner 结束 -->

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容