django項目的目錄結構:
dj_education文件夾:
settings.py:django項目的全局配置
url.py:url配置
templates文件夾:存放html文件
manage.py:項目啓動的文件
static文件夾:存放js、css、image等文件
log文件夾:存放log日誌
media文件夾:用戶上傳的文件
創建message應用: pycharm->tools-->run manage.py task-->輸入django命令 startapp message-->回車
apps包:(將項目劃分成多個應用) 設置mark as root 並在setttings.py配置apps的目錄 即可很方便的訪問apps下的包
message
生成數據表:pycharm->tools-->run manage.py task-->makemigrations-->migrate
靜態資源目錄配置 加載css和js、image:
settings.py:
# 靜態文件目錄配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
Django Model字段選項(Field Options)
數據庫操作:
查找:UserMessage.objects.filter(message=‘大時代’) 返回usermessage表 message="大時代"的所有數據,返回Queryset
可遍歷
UserMessage.objects.all() 返回usermessage表所有數據
UserMessage.objects.get(pk=1) 返回usermessage表主鍵爲1的數據
刪除:message.delete()
新增:user_message = UserMessage()
user_message.name = name
user_message.save()
from .models import UserMessage
def getform(request):
# filter(name=,message=) 通過字段name message查找 返回QuerySet 可遍歷
messages = UserMessage.objects.filter(message='大時代')
# message.delete() 刪除數據
for message in messages:
message.delete()
# post 方式提交表單
# if request.method == 'POST':
# request.POST.get() 獲取前端傳過來的參數
# name = request.POST.get('name', '')
# email = request.POST.get('email', '')
# address = request.POST.get('address', '')
# message = request.POST.get('message', '')
# 保存前端提交的信息 user_message.save()
# user_message = UserMessage()
# user_message.name = name
# user_message.email = email
# user_message.address = address
# user_message.message = message
# user_message.object_id = 'hello_world2'
# user_message.save()
# get方式返回表單頁面
return render(request, 'message_form.html')
django項目的數據庫設計:
app的整體設計 users用戶表 courses課程表 organization:課程機構和課程講師(課程講師屬於課程機構) operation:是三者之間的關聯操作表 避免循環引用
users_用戶管理表的設計:
django自帶的auth_user用戶表是不滿足項目需求的,需要在此基礎上擴展
輪播圖和郵箱驗證作爲獨立的表 放入用戶模塊
# python自帶的模塊
from datetime import datetime
# django自帶的模塊
from django.db import models
# 引入django自帶的auth_user表對應的類
# 查看源碼AbstractUser是一個抽象類可繼承
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, verbose_name=u"暱稱", default="")
# 生日可不填 允許爲空
birthday = models.DateField(verbose_name=u"生日", null=True, blank=True)
# 在django的models.py 中,我們定義了一些choices的元組,類似一些字典值,
# 一般都是下拉框或者單多選框,例如 0對應男 1對應女等
# 第一個元素存儲在數據庫中,第二個元素可由obj.get_gender_display獲取
gender = models.CharField(max_length=50, choices=(("male", u"男"), ("female", u"女")), default='female')
address = models.CharField(max_length=100, default=u"")
# 手機號可以爲空
mobile = models.CharField(max_length=11, null=True, blank=True)
# 圖片上傳 路徑upload_to 避免重名加入日期 %Y:年 %m:月, default:默認圖形
image = models.ImageField(upload_to='image/%Y/%m', default=u"image/default.png", max_length=100)
class Meta:
verbose_name = u'用戶信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
# 郵箱驗證 獨立的
class EmailVerifyRecord(models.Model):
code = models.CharField(max_length=20, verbose_name=u"驗證碼")
email = models.EmailField(max_length=50, verbose_name=u"郵箱")
send_type = models.CharField(choices=(('register', u"註冊"), ('forget', u"修改密碼")))
send_time = models.DateTimeField(default=datetime.now)
class Meta:
verbose_name = u"郵箱驗證碼"
verbose_name_plural = verbose_name
# 輪播圖 獨立的
class Banner(models.Model):
title = models.CharField(max_length=100, verbose_name=u"標題")
image = models.ImageField(upload_to="banner/%Y/%m", verbose_name=u"輪播圖", max_length=100)
url = models.URLField(max_length=200, verbose_name=u"訪問地址")
index = models.IntegerField(default=100, verbose_name=u"順序")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"輪播圖"
verbose_name_plural =verbose_name
注意:圖片上傳需要安裝pillow: pip install pillow
settings.py:
# 重載user
AUTH_USER_MODEL = 'users.UserProfile'
刪除原來的所有表 執行makemigration -->migrate重新生成數據表
course課程應用數據表設計:
from datetime import datetime
from django.db import models
# Create your models here.
# 課程信息表
class Course(models.Model):
name = models.CharField(max_length=50, verbose_name=u"課程名")
desc = models.CharField(max_length=300, verbose_name=u"課程描述")
# 課程詳情 富文本 不限長度 使用TextField()
detail = models.TextField(verbose_name=u"課程詳情")
degree = models.CharField(verbose_name=u"學習難度", choices=(("cj", "初級"), ("zj", "中級"), ("gj", "高級")), max_length=2)
# 學習時長
learn_times = models.IntergerField(default=0, verbose_name=u"學習時長(分鐘)")
students = models.IntegerField(default=0, verbose_name=u"學習人數")
fav_nums = models.IntegerField(default=0, verbose_name=u"收藏人數")
image = models.ImageField(upload_to='courses/%Y/%m', verbose_name=u"封面圖", max_length=100)
click_nums = models.IntegerField(default=0, verbose_name=u"點擊數")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"課程"
verbose_name_plural = verbose_name
# 課程表和章節表是一對多的關係 通過外鍵來關聯
class Lesson(models.Model):
course = models.ForeignKey(Course, verbose_name=u"課程")
name = models.CharField(max_length=100, verbose_name=u"章節名")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"章節"
verbose_name_plural = verbose_name
# 章節表和視頻表是一對多的關係 通過外鍵來關聯
class Video(models.Model):
lesson = models.ForeignKey(Lesson, verbose_name=u"章節")
name = models.CharField(max_length=100, verbose_name=u"視頻名")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"視頻"
verbose_name_plural = verbose_name
# 課程表和課程資源表是一對多的關係 通過外鍵關聯
class CourseResource(models.Model):
course = models.ForeignKey(Course, verbose_name=u"課程")
name = models.CharField(max_length=50, verbose_name=u"名稱")
download = models.FileField(upload_to="course/resource/%Y/%m", verbose_name=u"資源文件", max_length=100)
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"課程資源"
verbose_name_plural = verbose_name
organization機構應用數據表設計:
from datetime import datetime
from django.db import models
# Create your models here.
# 城市表
class CityDict(models.Model):
name = models.CharField(max_length=20, verbose_name=u"城市")
desc = models.CharField(max_length=200, verbose_name=u"描述")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"城市"
verbose_name_plural = verbose_name
# 機構信息表
class CourseOrg(models.Model):
name = models.CharField(max_length=50, verbose_name=u"機構名稱")
desc = models.TextField(verbose_name=u"機構描述")
click_nums = models.IntegerField(default=0, verbose_name=u"點擊數")
fav_nums = models.IntegerField(default=0, verbose_name=u"收藏數")
image = models.ImageField(upload_to="org/%Y/%m", verbose_name=u"封面圖")
address = models.CharField(max_length=150, verbose_name=u"機構地址")
# 城市下機構 一個城市對應多個機構 通過該外鍵關聯
city = models.ForeignKey(CityDict, verbose_name=u"所在城市")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"課程機構"
verbose_name_plural = verbose_name
# 教師信息表
# 一個機構對應多個教師 通過外鍵關聯
class Teacher(models.Model):
org = models.ForeignKey(CourseOrg, verbose_name=u"所屬機構")
name = models.CharField(max_length=50, verbose_name=u"教師名")
work_years = models.IntegerField(default=0, verbose_name=u"工作年限")
work_company = models.CharField(max_length=50, verbose_name=u"就職公司")
work_position = models.CharField(max_length=50, verbose_name=u"公司職位")
point = models.CharField(max_length=50, verbose_name=u"教學特點")
click_num = models.IntegerField(default=0, verbose_name=u"點擊數")
fav_num = models.IntegerField(default=0, verbose_name=u"收藏數")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")
class Meta:
verbose_name = u"教師"
verbose_name_plural = verbose_name
operation操作應用數據庫的設計:
from datetime import datetime
from django.db import models
from users.models import UserProfile
from courses.models import Course
# Create your models here.
# 用戶諮詢表
class UserAsk(models.Model):
name = models.CharField(max_length=20, verbose_name=u"姓名")
mobile = models.CharField(max_length=11, verbose_name=u"手機號")
curse_name = models.CharField(max_length=50, verbose_name=u"課程名")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"用戶諮詢"
verbose_name_plural = verbose_name
# 用戶課程評論表
class CourseComment(models.Model):
user = models.ForeignKey(UserProfile, verbose_name=u"用戶", on_delete=models.CASCADE)
course = models.ForeignKey(Course, verbose_name=u"課程", on_delete=models.CASCADE)
comments = models.CharField(max_length=200, verbose_name=u"評論")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"課程評論"
verbose_name_plural = verbose_name
# 用戶收藏
class UserFavorite(models.Model):
user = models.ForeignKey(UserProfile, verbose_name=u"用戶", on_delete=models.CASCADE)
fav_id = models.IntegerField(default=0, verbose_name=u"數據id")
# 收藏類型
fav_type = models.IntegerField(choices=((1, "課程"), (2, "課程機構"), (3, "授課老師")))
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"用戶收藏"
verbose_name_plural = verbose_name
# 用戶消息
class UserMessage(models.Model):
# 0:全部用戶 除0之外爲具體的id用戶
user = models.IntegerField(default=0, verbose_name=u"接收用戶")
message = models.CharField(max_length=500, verbose_name=u"消息內容")
has_read = models.BooleanField(default=False, verbose_name="是否已讀")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"用戶消息"
verbose_name_plural = verbose_name
# 用戶學習的課程
class UserCourse(models.Model):
user = models.ForeignKey(UserProfile, verbose_name=u"用戶", on_delete=models.CASCADE)
course = models.ForeignKey(Course, verbose_name=u"課程", on_delete=models.CASCADE)
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"用戶課程"
verbose_name_plural = verbose_name
注意:django2:models外鍵的必須設置 on_delete=models.CASCADE 否則會報錯
user = models.ForeignKey(UserProfile, verbose_name=u"用戶",on_delete=models.CASCADE)
執行makemigrations-->migrate 生成數據表
xadmin
1.安裝xadmin:https://github.com/sshwsfc/xadmin/tree/django2 github download zip
pycharm 新建extra_app python包並mark Directo as root
settings.py:
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))
將下載的包解壓下的xamin目錄至於extra_app目錄下
2.安裝依賴包:pip install django-crispy-forms django-import-export django-reversion django-formtools future httplib2 six xlsxwriter
3.settings.py註冊上:
INSTALLED_APPS=[
'django.contrib.admin',
'xadmin',
'crispy_forms',
'reversion'
]
4.urls.py:
# from django.contrib import admin
from django.urls import path, include
import xadmin
urlpatterns = [
# path('admin/', admin.site.urls),
path('message/', include('message.urls')),
path('xadmin/', xadmin.site.urls)
]
4.run運行 輸入127.0.0.1/xadmim 報錯
原因是沒有生成對應的數據表:執行makemigrations -->migrate
將app應用配置到xadmin中
以users應用爲例:在users下新建xadmin.py文件配置如下(UserProfile用戶信息表已自動註冊了無需再註冊):
# pycharm中配置的python文件的模板
__author__ = "westbrook-ding"
__date__ = "2018/10/22 0022 14:09"
import xadmin
from .models import EmailVerifyRecord, Banner
# 註冊xadmin郵箱驗證碼
class EmailVerifyRecordAdmin(object):
# list_display指定xadmin要顯示的字段
list_display = ['id', 'email', 'code', 'send_type', 'send_time']
# search_fields 提供搜索功能 可根據指定字段進行搜索
search_fields = ['email', 'code', 'send_type']
# list_filter可提供過濾器功能
list_filter = ['id', 'email', 'code', 'send_type', 'send_time']
# 註冊xadmin輪播圖
class BannerAdmin(object):
# list_display指定xadmin要顯示的字段
list_display = ['title', 'image', 'url', 'index', 'add_time']
# search_fields 提供搜索功能 可根據指定字段進行搜索
search_fields = ['title', 'image', 'url', 'index', 'add_time']
# list_filter可提供過濾器功能
list_filter = ['title', 'image', 'url', 'index', 'add_time']
xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)
xadmin.site.register(Banner, BannerAdmin)
xadmin的主題、系統名稱、底部公司、左側菜單等的設置
在users下的xadmin.py配置
# pycharm中配置的python文件的模板
__author__ = "westbrook-ding"
__date__ = "2018/10/22 0022 14:09"
import xadmin
# 引入xadmin的views 設置xadmin主題
from xadmin import views
# 設置主題
class BaseSetting(object):
enable_themes = True
use_bootswatch = True
# 全局設置
class GlobalSettings(object):
# 系統名稱
site_title = 'westbrook-ding教學後臺管理系統'
# 底部公司名稱
site_footer = 'westbrook-ding科技有限公司'
# 左側菜單的展示方式 默認展示 accordion:收起
menu_style = 'accordion'
# 通過views.BaseAdminView註冊主題配置
xadmin.site.register(views.BaseAdminView, BaseSetting)
# 通過views.CommAdminView註冊全局配置
xadmin.site.register(views.CommAdminView, GlobalSettings)
xadmin左側菜單應用名稱設置
以users應用爲例:
1.users下的app.py設置如下:
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'apps.users'
# 修改應用顯示名稱
verbose_name = u'用戶信息'
2.users下的__init__.py設置如下:
# 加載app配置
default_app_config = "users.apps.UsersConfig"