天天看点

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"