天天看點

Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin

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 Types)

Django Model字段選項(Field Options)

python django模型内部類meta詳細解釋

資料庫操作:

查找: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項目的資料庫設計:

Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin

app的整體設計 users使用者表 courses課程表 organization:課程機構和課程講師(課程講師屬于課程機構) operation:是三者之間的關聯操作表 避免循環引用

Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin

users_使用者管理表的設計:

django自帶的auth_user使用者表是不滿足項目需求的,需要在此基礎上擴充

Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin

輪播圖和郵箱驗證作為獨立的表 放入使用者子產品 

# 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課程應用資料表設計:

Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin
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機構應用資料表設計:

Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin
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操作應用資料庫的設計:

Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin
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 報錯
           
Django_xAdmin項目(一)之項目結構、資料庫的設計以及xadmin的配置xadmin

原因是沒有生成對應的資料表:執行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"