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装饰器 免去调用父类构造函数的麻烦
May 18 Python
Python天气预报采集器实现代码(网页爬虫)
Oct 07 Python
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Python多线程爬虫简单示例
Mar 04 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
利用Tensorflow的队列多线程读取数据方式
Feb 05 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
Apr 01 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
Jan 10 Python
Python NumPy灰度图像的压缩原理讲解
Aug 04 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 防恶意刷新实现代码
2010/05/16 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
Django框架中方法的访问和查找
2015/07/15 Python
Python面向对象之继承代码详解
2018/01/29 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
2014三八妇女节活动总结
2014/03/01 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
安全教育观后感
2015/06/17 职场文书
2015年女工委工作总结
2015/07/27 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js