Django开发的简易留言板案例详解


Posted in Python onDecember 04, 2018

本文实例讲述了Django开发的简易留言板。分享给大家供大家参考,具体如下:

Django在线留言板小练习

环境

ubuntu16.04 + python3 + django1.11

1、创建项目

django-admin.py startproject message

进入项目message

2、创建APP

python manager.py startapp guestbook

项目结构

.
├── guestbook
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── message
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-35.pyc
    │   └── settings.cpython-35.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

4 directories, 14 files

需要做的事:

配置项目setting 、初始化数据库、配置url 、编写views 、创建HTML文件

项目配置

打开message/settings.py

设置哪些主机可以访问,*代表所有主机

ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'guestbook',  #刚刚创建的APP,加入到此项目中
]
#数据库默认用sqlite3,后期可以换成MySQL或者SQL Server等
TIME_ZONE = 'PRC' #时区设置为中国

创建数据库字段

#encoding: utf-8
from django.db import models
class Message(models.Model):
  username=models.CharField(max_length=256)
  title=models.CharField(max_length=512)
  content=models.TextField(max_length=256)
  publish=models.DateTimeField()
  #为了显示
  def __str__(self):
    tpl = '<Message:[username={username}, title={title}, content={content}, publish={publish}]>'
    return tpl.format(username=self.username, title=self.title, content=self.content, publish=self.publish)

初始化数据库

# 1. 创建更改的文件
root@python:/online/message# python3 manage.py makemigrations
Migrations for 'guestbook':
 guestbook/migrations/0001_initial.py
  - Create model Message
# 2. 将生成的py文件应用到数据库
root@python:/online/message# python3 manage.py migrate
Operations to perform:
 Apply all migrations: admin, auth, contenttypes, guestbook, sessions
Running migrations:
 Applying contenttypes.0001_initial... OK
 Applying auth.0001_initial... OK
 Applying admin.0001_initial... OK
 Applying admin.0002_logentry_remove_auto_add... OK
 Applying contenttypes.0002_remove_content_type_name... OK
 Applying auth.0002_alter_permission_name_max_length... OK
 Applying auth.0003_alter_user_email_max_length... OK
 Applying auth.0004_alter_user_username_opts... OK
 Applying auth.0005_alter_user_last_login_null... OK
 Applying auth.0006_require_contenttypes_0002... OK
 Applying auth.0007_alter_validators_add_error_messages... OK
 Applying auth.0008_alter_user_username_max_length... OK
 Applying guestbook.0001_initial... OK
 Applying sessions.0001_initial... OK

配置url

设置项目message/urls.py

from django.conf.urls import url,include #添加了include
from django.contrib import admin
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^guestbook/', include('guestbook.urls',namespace='guestbook')),  #表示在url地址中所有guestbook的都交给guestbook下面的url来处理,后面的逗号不要省略
]

设置APP的url

如果是初次创建APP,urls.py在APP中一般不存在,创建即可

vim guestbook/urls.py

# 内容如下
from django.conf.urls import url
from . import views
urlpatterns = [
  url(r'^index/',views.index,name='index'),  #不要忘了逗号
]

编写views

编辑APP中的views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from . import models
# Create your views here.
def index(request):
  messages = models.Message.objects.all()
  return render(request, 'guestbook/index.html', {'messages' : messages})

编写HTML文件

创建APP/templates/guestbook/index.html目录及文件

使用bootstrap美化了

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>留言板</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" rel="external nofollow" crossorigin="anonymous">
  </head>
  <body>
    <table class="table table-striped table-bordered table-hover table-condensed">
      <thead>
        <tr class="danger">
          <th>留言时间</th>
          <th>留言者</th>
          <th>标题</th>
          <th>内容</th>
        </tr>
      </thead>
      <tbody>
        {% if messages %}
          {% for message in messages %}
            <tr class="{% cycle 'active' 'success' 'warning' 'info' %}">
              <td>{{ message.publish|date:'Y-m-d H:i:s' }}</td>
              <td>{{ message.username }}</td>
              <td>{{ message.title }}</td>
              <td>{{ message.content }}</td>
            </tr>
          {% endfor %}
        {% else %}
          <tr>
            <td colspan="4">无数据</td>
          </tr>
        {% endif %}
      </tbody>
    </table> 
    <a class="btn btn-xs btn-info" href="/guestbook/create/" rel="external nofollow" >去留言</a>
  </body>
</html>

调试index页面

python manage.py runserver 0.0.0.0:99

打开浏览器访问http://开发机器ip地址:99/guestbook/index/

Django开发的简易留言板案例详解

留言展示页面成功

创建留言页面

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>留言</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" rel="external nofollow" crossorigin="anonymous">
  </head>
  <body>
    <!-- 我是注释 -->
    <h3>留言</h3> <!--h1-> h6-->
    <!--method: POST /GET -->
    <form action="/guestbook/save/" method="POST" novalidate="novalidate">
    {% csrf_token %}
      <table class="table table-striped table-bordered table-hover table-condensed">
        <label>用户名:</label> <input type="text" name="username" placeholder="用户名" /> <br /><br />
        <label>标 题:</label> <input type="text" name="title" placeholder="标题" /><br /><br />
        <label>内 容:</label> <textarea name="content" placeholder="内容"> </textarea><br /><br />
      </table>
      <input class="btn btn-success" type="submit" value="留言"/>
    </form>
  </body>
</html>

配置APP下的url

vim guestbook/urls.py

urlpatterns = [
  url(r'^index/',views.index,name='index'),  #不要忘了逗号
  url(r'^create/$', views.create, name='create'),
  url(r'^save/$', views.save, name='save'), 
]

编辑views.py

#先导入时间模块
import datetime
#添加create、save
def create(request):
  return render(request, 'guestbook/create.html')
def save(request):
  username = request.POST.get("username")
  title = request.POST.get("title")
  content = request.POST.get("content")
  publish = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  message = models.Message(title=title, content=content, username=username, publish=publish)
  message.save()
  return HttpResponseRedirect('/guestbook/index/')

OK,再次运行,enjoy it!

Django开发的简易留言板案例详解

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python编程中对文件和存储器的读写示例
Jan 25 Python
Python中turtle作图示例
Nov 15 Python
Python实现合并两个列表的方法分析
May 28 Python
python opencv实现旋转矩形框裁减功能
Jul 25 Python
python3.6实现学生信息管理系统
Feb 21 Python
Python切图九宫格的实现方法
Oct 10 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
Python进度条的使用
May 17 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
Jun 11 Python
对python的bytes类型数据split分割切片方法
Dec 04 #Python
Python 从相对路径下import的方法
Dec 04 #Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 #Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 #Python
对web.py设置favicon.ico的方法详解
Dec 04 #Python
对python 命令的-u参数详解
Dec 03 #Python
python 接收处理外带的参数方法
Dec 03 #Python
You might like
PHP小教程之实现双向链表
2014/06/12 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
用jscript实现列出安装的软件列表
2007/06/18 Javascript
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
理论讲解python多进程并发编程
2018/02/09 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
详解Python字典小结
2018/10/20 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
Python的几种主动结束程序方式
2019/11/22 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
会计出纳岗位职责
2013/12/25 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
怎样写辞职信
2015/02/27 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
文艺节目主持词
2015/07/06 职场文书
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
Redis过期数据是否会被立马删除
2022/07/23 Redis