用 Django2.0 做 简单的BBS(前端用 Bootstrap)
实现目标:
开发首页显示BBS的标题和摘要,点击BBS的标题可跳转到BBS详细页面进行展示。
开发环境及开发工具:
Python 3.6.3
Django 2.0
Pycharm 2017.3
实现过程:
1创建project
用语句创建:
django-admin startproject BBS_Pro
2、创建app
python manage.py startapp app01
3、启动服务
python manage.py runserver
4、编辑BBS_Pro/settings
把新创建的app名称加入,进行admin汉化:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
LANGUAGE_CODE = 'zh-hans' #修改
5、定义数据模型
编辑mblog/models.py
from django.db import models
from django.contrib.auth.models import User #导入django自带的用户
class BBS(models.Model): #BBS
title = models.CharField(max_length=50) #标题
summary = models.CharField(max_length=200,blank=True,null=True) #摘要。可以为空,blank是admin中可为空,null是表里可为空
content = models.TextField() #内容
author = models.ForeignKey( 'BBS_user',on_delete=models.CASCADE,) #作者,外键到BBS_user中,用到还未定义的表要用引号
view_count = models.IntegerField() #浏览次数
ranking = models.IntegerField() #排名
created_at = models.DateTimeField() #创建时间
update_at = models.DateTimeField() #更新时间
def __str__(self):
return self.title class Category(models.Model): #板块
name = models.CharField(max_length=30,unique=True) #板块名称,unique是不能重复
administrator = models.ForeignKey('BBS_user',on_delete=models.CASCADE,) #版主
def __str__(self):
return self.name class BBS_user(models.Model): #用户表。继承django自带的用户认证系统
user = models.OneToOneField(User,on_delete=models.CASCADE,) #用户
signature = models.CharField(max_length=100,default='这家伙没有签名') #签名
photo = models.ImageField(upload_to="upload_imgs/", default="upload_imgs/user_1.jpg") #头像默认一个图片,upload_to会自动在根目录创建一个文件夹,支持上传
def __str__(self):
return self.user.username
6、生成数据表
python manage.py makemigrations app01 python manage.py migrate
7、生成admin的超级管理员
python manage.py createsuperuser
8、修改mblog/admin.py内容
from django.contrib import admin
from app01 import models class BBS_admin(admin.ModelAdmin):
list_display = ('title','summary','author','view_count','ranking','created_at','update_at')
#上面一行作用是在admin中显示需要显示的字段
list_filter = ('created_at',) #是一个元组,末尾要加逗号
search_fields = ('title','summary','author__user__username')
#在admin中创建搜索,如果是外键的字段则用'auther__user__username'形式,此处要主要。 admin.site.register(models.BBS,BBS_admin)
admin.site.register(models.Category)
admin.site.register(models.BBS_user)
登录admin 127.0.0.1:8000/admin
9、创建模板和静态文件的文件夹
创建文件夹BBS_Pro/app01/templates/app01 这里放app01的所有模板;创建文件夹BBS_Pro/statics 这里放所有用到的静态文件。
Settings中增加内容:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "statics"),
]
Settings中修改TEMPLATES 的DIRS内容
'DIRS': [os.path.join(BASE_DIR, 'templates')],
10、创建文件app01/urls.py
from django.urls import path,include
from app01 import views
urlpatterns = [
path('',views.index,name='index'),
]
11、修改BBS_Pro/urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('bbs/',include('app01.urls')),
]
12、修改app01/views.py内容
from django.shortcuts import render
from .models import BBS
def index(request):
bbs_lists =BBS.objects.all()
return render(request,'app01/index.html',{'bbs_lists':bbs_lists})
13、创建共享模版BBS_Pro/templates/base.html
Base.html可用bootstrap里面的模板修改,在需要的区域进行如下标记,便于其他模板补充
{% block page_content %}
{% endblock %}
具体页面代码如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="/static/image/favicon.ico">
<title>页面头名称</title>
<!-- Bootstrap core CSS -->
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="navbar.css" rel="stylesheet">
</head>
<body>
<div class="container">
<!-- Static navbar -->
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">项目测试名称</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">全部</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">列表 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li class="dropdown-header">Nav header</li>
<li><a href="#">Separated link</a></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container-fluid -->
</nav>
<!-- Main component for a primary marketing message or call to action -->
<div class="jumbotron">
{% block page_content %}
{% endblock %}
</div>
</div> <!-- /container -->
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="/static/js/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>
14、新增模板index.html
app01/templates/app01/index.html
{% extends 'base.html' %} {% block page_content %}
{% for bbs_list in bbs_lists %}
<h4><a href="#">{{ bbs_list.title }}</a></h4>
<h5>{{ bbs_list.summary}}</h5>
<hr>
{% endfor %}
{% endblock %}
15、修改views.py
定义index
from django.shortcuts import render
from .models import BBS
def index(request):
bbs_lists =BBS.objects.all()
return render(request,'app01/index.html',{'bbs_lists':bbs_lists})
16、查看效果 127.0.0.1/bbs
通过127.0.0.1/admin手工添加一些后台数据。
17、做bbs的详细页面
修改app01/urls.py内容,增加url:
path('<int:bbs_id>/',views.bbs_detail,name='bbs_detail'),
18、修改views.py
定义bbs_detail
def bbs_detail(request,bbs_id): #传的参数给url用
bbss =BBS.objects.get(id=bbs_id)
return render(request,'app01/detail.html',{'bbs_obj':bbss}) #字典给模板用
19、新建模板detail.html
app01/templates/app01/detail.html
{% extends 'base.html' %} {% block page_content %}
<h4>{{ bbs_obj.title }}</h4>
<h5>{{ bbs_obj.summary}}</h5>
<h5>{{ bbs_obj.content}}</h5>
<h5>{{ bbs_obj.author}}</h5>
<h5>{{ bbs_obj.view_count}}</h5>
<h5>{{ bbs_obj.ranking}}</h5>
<h5>{{ bbs_obj.created_at}}</h5>
<h5>{{ bbs_obj.update_at}}</h5>
<hr>
{% endblock %}
20、修改index.html中的链接
{% extends 'base.html' %} {% block page_content %}
{% for bbs_list in bbs_lists %}
<h4><a href="/bbs/{{bbs_list.id}}">{{ bbs_list.title }}</a></h4>
<h5>{{ bbs_list.summary}}</h5>
<hr>
{% endfor %}
{% endblock %}
首页中点击bbs标题可链接进入bbs的详细内容页面。
用 Django2.0 做 简单的BBS(前端用 Bootstrap)的更多相关文章
- 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...
- Python开发一个简单的BBS论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- Django2.0使用
创建项目: 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: django-admin startproject [项目的名称] 这样就可以在当前目录下创建一个项目了. 通 ...
- 《玩转Django2.0》读书笔记-Django配置信息
<玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...
- 《玩转Django2.0》读书笔记-Django建站基础
<玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...
- Django2.0路由层-URLconf
目录 DJango2.0路由层-URLconf 概述 urlpatterns 实例 path转换器 自定义path转换器 使用正则表达式 命名组(有名分组) URLconf匹配请求URL中的哪些部分 ...
- 10 腾讯云、django2.0、uwsgi、mysql、nginx 部署
1.腾讯云 操作系统 Ubuntu Server 16.04.1 LTS 64位 获取root权限 ubuntu@VM---ubuntu:~$ sudo passwd root Enter new U ...
- vue2.0做移动端开发用到的相关插件和经验总结1.0
最近在用vue2.0做微信公众号相关的前端开发,经过这次开发实践,现将项目中用到的相关比较实用的插件及遇到的相关问题进行整理,希望和大家共同交流...... cssrem:一个CSS值转REM的VSC ...
- Django2.0路由补充之path,re_path及视图层
以下是Django2.0版本 正则捕获到的参数都是字符串,所以如果函数需要用的其他数据类型,可以在函数中直接转换,也可以在路由中直接转换,如下: 下面实例是匹配整数,传过去的参数就是整数 from d ...
随机推荐
- 入口文件 index.php
一. 运行流程 The index.php serves as the front controller, initializing the base resources needed to run ...
- web前端学习总结--CSS
CSS 什么是CSS? CSS 指层叠样式表(Cascading Style Sheets) 样式定义如何显示HTML元素 样式通常存储在样式表中 如何使用CSS 内联方式 样式定义在单个的HTML元 ...
- 非递归全排列 python实现
python algorithm 全排列(Permutation) 排列(英语:Permutation)是将相异物件或符号根据确定的顺序重排.每个顺序都称作一个排列.例如,从一到六的数字有720种排列 ...
- ES6 基础学习
ECMAScript 6 标准入门 一.let和const let命令 let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效:是块级作用域,且let不允许 ...
- 51.percentiles rank以及网站访问时延SLA统计
主要知识点: percentile_ranks的用法 percentile的优化 一.percentile_ranks的用法 SLA:就是所提供的服务的标准. 比如一个网站的提供的访问延时的S ...
- 4 pandas模块,Series类
对gtx图像进行操作,使用numpy知识 如果让gtx这张图片在竖直方向上进行颠倒. 如果让gtx这张图片左右颠倒呢? 如果水平和竖直方向都要颠倒呢? 如果需要将gtx的颜色改变一下呢 ...
- hdu2011 多项式求和【C++】
多项式求和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- RBAC(Role-Based Access Control)
http://hi.baidu.com/akini/blog/item/eddbd61b90f6d4fbae513371.html RBAC 求助编辑百科名片 基 于角色的访问控制(Role-Base ...
- 暑假集训D19总结
考试 日常爆炸 T1 辣么简单,淼到极致的DP,我竟然打挂了= =,打挂了= =,只拿了75分啊,不能接受啊= = T2 随便找找规律,瞎XX模拟一下就能A的鬼东西,我竟然打了个暴力+Floy ...
- Zend_Form 创建、校验和解析表单的基础--(手冊)
1. 创建表单对象 创建表单对象很easy:仅仅要实现 Zend_Form: <?php $form = newZend_Form; ? > 对于高级用例.须要创建 Zend_Form ...