Django1.11x+Postgres9.4實現一個評論系統的demo
by:aideny
time:2019/10/4
注:博主也是前天才接觸django和postgresql,讀者如果有什麼問題可以一起交流溝通~
0.預處理
開發環境首先要安裝配置好postgresql,並且要創建好一個可用的數據庫,這個數據庫就是後面django主要用到的。
博主配置:
Postgresql: 9.4
數據庫:test
用戶名:test
密碼:test
1. django相關
1.1 啓動一個項目:
django-admin startproject TestDjango
1.2 django配置相關:
打開TestDjango/TestDjango/setting.py
:
1.2.1 配置數據庫
DATABASES = {
# django默認的數據庫是sqlite,我們需要註釋掉或者刪掉關於sqlite的配置
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# postgressql相關的配置
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'test', # 在postgresql中創建的數據庫名
'USER': 'test', # postgresql 用戶名
'PASSWORD': 'test', # postgresql 用戶密碼
'HOST': '192.168.204.129', # 主機IP
'PORT': 5432, # postgresql 端口號
}
}
1.2.2 配置時區
USE_IZ = False # 不使用默認的時區
TIME_ZONE = 'Asia/Shanghai' # 使用上海時區
1.2.3 配置模板路徑
TEMPLATES = [
{
# somthing configuration
'DIRS': [BASE_DIR + "/templates"], # 配置模板路徑,注意結尾有一個半角逗號
# somthing configuration
}
]
在manage.py
的同級目錄下創建目錄:templates
1.2.4 其他配置
ALLOWED_HOSTS = ['*'] # 表示允許所有主機訪問
1.3 新建一個模型:
python manage.py startapp fakedata
1.4 設計模型結構:
這裏是這樣設計的,models包含兩個類:User和Comment。
User類包含的屬性有:用戶名,密碼,Email,註冊時間。
Comment包含的屬性有:評論內容,評論發佈時間。
這兩個類之間還有一種“多對多”的關係,在django中表示這種關係的機制是:它會自動創建一張表來存儲這兩個類之間的關係,如果這張表中只有這兩個字段(兩個類),那麼直接用ManyToManyField
屬性默認的即可;如果這張表中除了這兩個字段外,還有其他的字段,比如這裏的用戶和評論關係表中,除了用戶和評論內容外,還有一個評論的發佈時間,那麼就要用throught
導出到另外的一個類來說明。詳細的操作步驟可以參考下面的代碼。
打開fakedata/models.py
# -*- coding:UTF-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.utils import timezone
class User(models.Model):
name = models.CharField(max_length=20) # 用戶名
password = models.CharField(max_length=20) # 用戶密碼
email = models.EmailField() # Email
register_date = models.DateField() # 註冊時間
class Comment(models.Model):
data = models.CharField(max_length=100) # 評論內容
users = models.ManyToManyField(User, through="UserComment") # 建立多對多關係
# 用throught導出到一個單獨的類來說明用戶和評論之間的關係
class UserComment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE) # user作爲外鍵
comment = models.ForeignKey(Comment, on_delete=models.CASCADE) # comment作爲外鍵
pushed_at = models.DateTimeField(default=timezone.now)
# 用戶和評論的關係表使用自定義的名稱
class Meta:
db_table = "user_comment_relationsship"
1.5 修改django配置文件:
打開TestDjango/TestDjango/setting.py
:
INSTALLED_APPS = [
# default confiuratuin
'fakedate', # 添加剛纔的模型,注意結尾有一個半角逗號
]
1.6 在django中應用模型:
1.6.1 創建模型
python manage.py makemigrations
1.6.2 應用到數據庫
python manage.py migrate
到這裏django項目中要用到的數據庫表結構就已經創建好了。
1.7 編寫模型代碼:
編寫模型代碼和設計模板結構其實是同步進行的,在編寫模型代碼的過程中考慮會用到的模板
打開TestDjango/TestDjango/testdb.py
(這個文件需要我們創建,文件名無所謂,合理即可):
# -*- coding:UTF-8 -*-
from django.http import HttpResponse
from django.shortcuts import render_to_response
from datetime import date
from datetime import datetime
from fakedata.models import User # 引入User表句柄
from fakedata.models import Comment # 引入Comment表句柄
from fakedata.models import UserComment # 引入UserComment表句柄
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def register_form(request):
return render_to_response('register_form.html')
def register(request):
'''
註冊用戶
'''
request.encoding = 'utf-8'
user_name = request.GET['UserName']
passwd = request.GET['PassWord']
Email = request.GET['Email']
User.objects.create(name=user_name, password=passwd, email=Email, register_date=date.today())
response = "<p>註冊成功!</p>"
return HttpResponse(response)
def get_user(request):
'''
獲取已註冊的所有用戶信息
'''
List = User.objects.all()
response = ""
for var in List:
response += var.name + " | " + var.password + " | " + var.email + "<br>"
return HttpResponse("<p>" + response + "</p>")
def push_comment_form(request):
return render_to_response('comment_form.html')
def push_comment(request):
'''
發表評論
'''
request.encoding = 'utf-8'
user_name = request.GET['UserName']
message = request.GET['Message']
# 獲取作者中間模型
user_tmp = User.objects.get(name=user_name)
# 添加評論,並獲取評論中間模型
comment_tmp = Comment.objects.create(data=message)
# 向 user_comment_relationship 表添加數據
UserComment.objects.create(user=user_tmp, comment=comment_tmp, pushed_at=datetime.now())
response = "<p>註冊成功!</p>"
return HttpResponse(response)
def get_comment(request):
'''
獲取評論信息
'''
List = UserComment.objects.all()
response = ""
for var in List:
response += var.user.name + " | " + str(var.pushed_at)[0:-7] + " | " +\
var.comment.data + "<br>"
return HttpResponse("<p>" + response + "</p>")
1.8 添加url路徑:
打開TestDjango/TestDjango/urls.py
from django.conf.urls import url
from django.contrib import admin
from . import testdb
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^register_form/$', testdb.register_form), # 註冊界面url
url(r'^register/$', testdb.register), # 註冊cgi url
url(r'^get_user/$', testdb.get_user), # 獲取所有用戶信息url
url(r'^comment_form/$', testdb.push_comment_form), # 添加評論界面
url(r'^comment/$', testdb.push_comment), # 評論cgi url
url(r'^get_comment/$', testdb.get_comment), # 獲取所有評論信息界面url
]
1.9 編寫模板代碼
前端頁面寫的很簡陋,這裏的代碼只是爲了簡單的支持我們項目的運行~
編寫register_form.html
:
<DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Register</title>
</head>
<body>
<form action="/register/" method="get">
UserName: <input type="text", name="UserName"><br>
PassWord: <input type="text", name="PassWord"><br>
Email : <input type="text", name="Email"><br>
<input type="submit" value"提交">
</form>
</body>
</html>
編寫comment_form.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>評論</title>
</head>
<body>
<form action="/comment/">
用戶名:<input type="text" name="UserName"><br><br>
<textarea rows="10" cols="30" placeholder="內容" name="Message"></textarea>
<input type="submit" value="發表">
</form>
</body>
</html>
1.10 運行項目
現在這個項目就可以完整跑一邊流程了。
啓動項目:python manage.py runserver 192.168.204.128:8000
訪問http://192.168.204.128/register_form/
:
註冊:
訪問http://192.168.204.128/get_user/
:
訪問http://192.168.204.128/comment_form/
:
訪問http://192.168.204.128/get_comment/
:
2. postgresql
2.1 相關命令附錄
啓動命令:psql -h localhost -p 5432 -U test --password
列舉數據庫:\l
選擇數據庫:\c 數據庫名
查看該某個庫中的所有表:\dt
查看某個庫中的某個表結構:\d 表名
退出psgl:\q
參考資料
-
https://docs.djangoproject.com/en/1.11/ref/models/fields/#model-field-types
-
https://m.w3cschool.cn/django