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路由規則函數
/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> 發佈於 <span>{{ article.create_time|date:'Y-m-d H:i' }}</span> {# 表示一個空格 #} <span class="glyphicon glyphicon-comment" style="color: #1b6d85;vertical-align: -3px"></span>評論({{ article.comment_count }}) <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>
首頁顯示效果以下圖: