Django博客項目之首頁

1、Django-admincss

一、建立表和註冊表html

settings.py文件:python

TIME_ZONE = 'Asia/Shanghai'    #支持中文數據jquery


models.py文件內容:django

from django.db import models
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用戶信息
    """
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=11, null=True, unique=True)
    avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png")
    create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True)
    blog = models.OneToOneField(to='Blog', to_field='nid', null=True)
    def __str__(self):
        return self.username
class Blog(models.Model):
    """
    博客(我的站點)信息
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='我的博客標題', max_length=64)
    site = models.CharField(verbose_name='我的博客後綴', max_length=32, unique=True)
    theme = models.CharField(verbose_name='博客主題', max_length=32)
    def __str__(self):
        return self.title
class Category(models.Model):
    """
    博主我的文章分類表
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='分類標題', max_length=32)
    blog = models.ForeignKey(verbose_name='所屬博客', to='Blog', to_field='nid')
    def __str__(self):
        return self.title
class Tag(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='標籤名稱', max_length=32)
    blog = models.ForeignKey(verbose_name='所屬博客', to='Blog', to_field='nid')
    def __str__(self):
        return self.title
class Article(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50, verbose_name='文章標題')
    desc = models.CharField(max_length=255, verbose_name='文章描述')
    create_time = models.DateTimeField(verbose_name='建立時間')
    comment_count=models.IntegerField(default=0)
    up_count=models.IntegerField(default=0)
    down_count=models.IntegerField(default=0)
    category = models.ForeignKey(to='Category', to_field='nid', null=True)
    user = models.ForeignKey(verbose_name='做者', to='UserInfo', to_field='nid')
    tags = models.ManyToManyField(
        to="Tag",
        through='Article2Tag',
        through_fields=('article', 'tag'),
    )
    def __str__(self):
        return self.title
class ArticleDetail(models.Model):
    """
    文章詳細表
    """
    nid = models.AutoField(primary_key=True)
    content = models.TextField()
    article = models.OneToOneField(to='Article', to_field='nid')
class Article2Tag(models.Model):
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
    tag = models.ForeignKey(verbose_name='標籤', to="Tag", to_field='nid')
    class Meta:
        unique_together = [
            ('article', 'tag'),
        ]
    def __str__(self):
        v = self.article.title + "--" + self.tag.title
        return v
class ArticleUpDown(models.Model):
    """
    點贊表
    """
    nid = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserInfo', null=True)
    article = models.ForeignKey("Article", null=True)
    is_up = models.BooleanField(default=True)
    class Meta:
        unique_together = [
            ('article', 'user'),
        ]
class Comment(models.Model):
    """
    評論表
    """
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='評論文章', to='Article', to_field='nid')
    user = models.ForeignKey(verbose_name='評論者', to='UserInfo', to_field='nid')
    content = models.CharField(verbose_name='評論內容', max_length=255)
    create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True)
    parent_comment = models.ForeignKey('self', null=True)
    def __str__(self):
        return self.content

admin.py文件內容:(註冊表)bootstrap

from django.contrib import admin
from .models import *
admin.site.register(UserInfo)
admin.site.register(Blog)
admin.site.register(Category)
admin.site.register(Tag)
admin.site.register(Article)
admin.site.register(Article2Tag)
admin.site.register(ArticleDetail)
admin.site.register(ArticleUpDown)
admin.site.register(Comment)


urls.py文件內容:瀏覽器

from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

二、登陸錄入數據app

登陸的帳號必須是超級用戶,咱們用本身建立的用戶rootide

admin-login.png

進入.png



三、admin路由規則函數


/admin/app01/role/           查看角色列表
/admin/app01/role/add/      添加角色
/admin/app01/role/2/change/ 編輯
/admin/app01/role/2/delete/ 刪除

/admin/app01/userinfo/               /admin/應用名/表名
/admin/app01/userinfo/add/          /admin/應用名/表名/功能名
/admin/app01/userinfo/1/change/       /admin/app01/userinfo/1/delete/

2、博客項目主頁

一、FileField與ImageField分析

(1)項目的根目錄下存儲文件
userinfo表設置:
class userinfo:
            avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png")
視圖函數獲取文件對象:
avatar = request.FILES.get("avatar_img")
UserInfo.objects.create_user(username=user, password=pwd, email=email, avatar=avatar)
Django會在項目的根目錄建立avatars文件夾,將上傳文件下載到該文件夾中,avatar字段保存的是文件的相對路徑。

(2)指定目錄下存儲文件
若是settings.py配置 MEDIA_ROOT=os.path.join(BASE_DIR, "blog", "media")
Django會MEDIA_ROOT下建立avatars文件夾,將上傳文件下載到該文件夾中,avatar字段保存的是文件的相對路徑。

(3)用戶直接訪問media目錄
url.py文件設置:
from django.conf.urls import url,include
from django.contrib import admin
from django.views.static import serve
from cnblog_s20 import settings
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]
settings.py文件:
MEDIA_URL = "/media/"        #添加的別名

最後瀏覽器能夠直接訪問:
http://127.0.0.1:8000/media/avatars/lu.jpg,便可以看到上傳的圖片

二、導航條

若是用戶是登陸狀態,就讓顯示登陸狀態;若是用戶尚未登陸,就在導航條上顯示登陸,註冊,在html頁面作if判斷


<ul class="nav navbar-nav navbar-right">
{% if request.user.username %}                                     {#用戶是登陸狀態#}
    <li><a href="#">{{ request.user.username }}</a></li>            {#顯示當前用戶的用戶名#}
    <li><a href="/logout/">註銷</a></li>
    <li class="dropdown">
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
      <ul class="dropdown-menu">
        <li><a href="#">修改密碼</a></li>
        <li><a href="#">我的中心</a></li>
        <li><a href="#">Something else here</a></li>
        <li role="separator" class="divider"></li>
        <li><a href="#">Separated link</a></li>
      </ul>
    </li>
 {% else %}
    <li><a href="/login/">登陸</a></li>
    <li><a href="/reg/">註冊</a></li>
{% endif %}
</ul>

3、博客首頁頁面及視圖函數

一、視圖函數

views.py文件添加index函數:

def index(request):
    article_list=Article.objects.all()                   #獲得全部文章的列表
    return render(request,"index.html",locals())


二、博客首頁頁面

index.html頁面:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bs/css/bootstrap.css">
    <script src="/static/js/jquery-3.2.1.min.js"></script>
    <script src="/static/bs/js/bootstrap.js"></script>
    <style>
        .desc{
            margin-left: -28px;                   {#文章摘要向左偏移28px#}
            text-align: justify;                  {#文章摘要右對齊#}
        }
        .article_item .info{
            margin-top: 10px;
        }
    </style>
</head>
<body>
<nav class="navbar navbar-default">
  <div>
    <!-- Brand and toggle get grouped for better mobile display -->
    <div>
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span>Toggle navigation</span>
        <span></span>
        <span></span>
        <span></span>
      </button>
      <a href="#">博客園</a>
    </div>
    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li><a href="#">隨筆<span>(current)</span></a></li>
        <li><a href="#">園林</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        {% if request.user.username %}
            <li><a href="#">{{ request.user.username }}</a></li>
            <li><a href="/logout/">註銷</a></li>
            <li>
              <a href="#" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span></span></a>
              <ul>
                <li><a href="#">修改密碼</a></li>
                <li><a href="#">我的中心</a></li>
                <li><a href="#">Something else here</a></li>
                <li role="separator"></li>
                <li><a href="#">Separated link</a></li>
              </ul>
            </li>
         {% else %}
            <li><a href="/login/">登陸</a></li>
            <li><a href="/reg/">註冊</a></li>
        {% endif %}
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>
<div>
    <div>
           <div>
               <div class="panel panel-primary">
                  <div>
                    <h3>Panel title</h3>
                  </div>
                  <div>
                    Panel content
                  </div>
                </div>
               <div class="panel panel-danger">
                  <div>
                    <h3>Panel title</h3>
                  </div>
                  <div>
                    Panel content
                  </div>
                </div>
               <div class="panel panel-success">
                  <div>
                    <h3>Panel title</h3>
                  </div>
                  <div>
                    Panel content
                  </div>
                </div>
           </div>
           <div>
           <div>
               {% for article in article_list %}
               <div>
                     <h5><a href="">{{ article.title }}</a></h5>                  {#顯示文章標題#}
                     <div>
                         <div>
                             <div>
                                 <img width="60" height="60" src="/media/{{ article.user.avatar }}" alt="">   {#顯示用戶頭像#}
                             </div>
                             <div>
                                 <div>
                                     {{ article.desc }}                              {#顯示文章摘要內容#}
                                 </div>
                             </div>
                         </div>
                     </div>
                     <div class="small info">
                         <a href=""><span>{{ article.user.username }}</span></a>&nbsp;&nbsp;發佈於
                         <span>{{ article.create_time|date:'Y-m-d H:i' }}</span>&nbsp;&nbsp;&nbsp;&nbsp;      {#  &nbsp;表示一個空格 #}
                         <span class="glyphicon glyphicon-comment" style="color: #1b6d85;vertical-align: -3px"></span>評論({{ article.comment_count }})&nbsp;&nbsp;
                         <span class="glyphicon glyphicon-thumbs-up" style="color: #1b6d85;vertical-align: -3px"></span>點贊({{ article.up_count }})     {# vertical-align: -3px表示向下偏移3px #}
                     </div>
               </div>
                   <hr>
               {% endfor %}
           </div>
           </div>
           <div>
               <div class="panel panel-warning">
                  <div>
                    <h3>Panel title</h3>
                  </div>
                  <div>
                    Panel content
                  </div>
                </div>
           </div>
    </div>
</div>
</body>
</html>

首頁顯示效果以下圖:

主頁.png

相關文章
相關標籤/搜索