一、Django-admin
1、创建表和注册表
settings.py文件:
TIME_ZONE = 'Asia/Shanghai' #支持中文数据
models.py文件内容:
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文件内容:(注册表)
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),
]
2、登录录入数据
登录的账号必须是超级用户,我们用自己创建的用户root
3、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/
二、博客项目主页
1、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,即可以看到上传的图片
2、导航条
如果用户是登录状态,就让显示登录状态;如果用户还没有登录,就在导航条上显示登录,注册,在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>
三、博客首页页面及视图函数
1、视图函数
views.py文件添加index函数:
def index(request):
article_list=Article.objects.all() #得到所有文章的列表
return render(request,"index.html",locals())
2、博客首页页面
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>
首页显示效果如下图:
转载于:https://blog.51cto.com/qidian510/2119963