一 項(xiàng)目概述
項(xiàng)目運(yùn)行環(huán)境 1 python3.6+ 2 Django 1.11 3 mysql 5.7
項(xiàng)目詳細(xì)功能介紹
前臺(tái)功能 1 項(xiàng)目首頁(yè)展示 2 輪播圖 3 博客推薦 4 最新發(fā)布 5 博客分類 6 最新評(píng)論文章 7 搜索功能 8 博客分類功能 9 博客標(biāo)簽查詢 10 友情鏈接 11 博客分頁(yè)
二 開(kāi)發(fā)環(huán)境搭建
三 創(chuàng)建項(xiàng)目
1 進(jìn)入虛擬環(huán)境創(chuàng)建項(xiàng)目
django-admin startproject django_blog
2 進(jìn)入項(xiàng)目創(chuàng)建應(yīng)用
python manage.py startapp userapp
python manage.py startapp blogapp
3 在settings中配置數(shù)據(jù)庫(kù)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog_db',
'USER': 'root',
'PASSWORD': '1',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
4 執(zhí)行遷移文件
python manage.py migrate
5 創(chuàng)建超級(jí)管理員
python manage.py createsuperuser
四 創(chuàng)建數(shù)據(jù)模型
userapp
USER(用戶模型)
from django.contrib.auth.models import AbstractUser
class BlogUser(AbstractUser):
nikename = models.CharField('昵稱', max_length=20, default='')
注:需要在settings配置文件中設(shè)置: AUTH_USER_MODEL = 'users.BlogUser'
blogapp
Banner(輪播圖模型)
class Banner(models.Model):
title = models.CharField('標(biāo)題'程腹,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(標(biāo)簽?zāi)P?
class Tags(models.Model):
name = models.CharField('標(biāo)簽名稱', max_length=20, default='')
class Meta:
verbose_name = '標(biāo)簽'
verbose_name_plural = '標(biāo)簽'
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='標(biāo)簽')
title = models.CharField('標(biāo)題', max_length=50)
content = models.TextField('內(nèi)容')
pub_date = models.DateTimeField('發(fā)布日期', default=datetime.now)
cover = models.ImageField('博客封面', upload_to='static/images/post', default=None)
views = models.IntegerField('瀏覽數(shù)', default=0)
recommend = models.BooleanField('推薦博客', default=False)
def __str__(self):
return self.title
class Meta:
verbose_name = '博客'
verbose_name_plural = '博客'
Comment(評(píng)論模型)
class Comment(models.Model):
post = models.ForeignKey(Post, verbose_name='博客')
user = models.ForeignKey(BlogUser, verbose_name='作者')
pub_date = models.DateTimeField('發(fā)布時(shí)間')
content = models.TextField('內(nèi)容')
def __str__(self):
return self.content
class Meta:
verbose_name = '評(píng)論'
verbose_name_plural = '評(píng)論'
FriendlyLink(友情鏈接模型)
class FriendlyLink(models.Model):
title = models.CharField('標(biāo)題', max_length=50)
link = models.URLField('鏈接', max_length=50, default='')
def __str__(self):
return self.title
class Meta:
verbose_name = '友情鏈接'
verbose_name_plural = '友情鏈接'
五敌卓、實(shí)現(xiàn)首頁(yè)頁(yè)面模板創(chuàng)建模板文件夾
創(chuàng)建模板文件templates,并在settings.py中設(shè)置
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',
],
},
},
]
配置靜態(tài)文件路徑
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
六奖磁、創(chuàng)建首頁(yè)路由
創(chuàng)建視圖函數(shù)
def index(request):
return render(request, 'index.html', {})
- 配置url
url(r'^index/$', index, name='index' )
七、實(shí)現(xiàn)幻燈片功能(Banner)
注冊(cè)模型
from blogs.models import Banner
admin.site.register(Banner)
編寫(xiě)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 開(kāi)始 -->
<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">上一個(gè)</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">下一個(gè)</span> </a>
</div>
<!-- banner 結(jié)束 -->