Django
一.创建项目
1,使用pycharm创建虚拟环境以及Django项目
1.1 使用命令创建Django项目
1、打开cmd,cd到指定的文件夹
2、输入:django-admin startproject 项目名
1.2 使用命令创建虚拟环境
1, 打开cmd,cd到指定的文件夹
2, virtualenv env # env为虚拟环境名称
3, cd env/bin/
4, source activate 当路径前⾯出现了(env)代表激活成功
2,创建Django app
cd 到项目目录
python manage.py startapp index
python manage.py startapp ranking
python manage.py startapp read
python manage.py startapp search
python manage.py startapp user
3,创建static文件夹/media文件夹
1,static文件夹
1.1 css文件夹
1.2 image文件夹
1.3 js文件夹
2,media文件夹
2.1 novel_img文件夹
4,运行Django项目
方法一: cmd 启动
cd到Django跟目录下
python manage.py runserver
方法二: pycharm启动
pycharm直接启动
小技巧:pycharm修改Django启动端口号,
菜单→运行→编辑配置→Django服务器→项目
二.setting设置
novel → setting.py
ALLOWED_HOSTS配置
- 可以使用那些iP或者域名来访问系统
- 默认为空,可以使用127.0.0.1或者localhost,也可以指定ip
- 如果想允许任何ip进行访问,可以设置为*
在项目下的settings.py中设置允许任何ip访问
DEBUG = True
ALLOWED_HOSTS = ['*']
注册app
创建的app需要在settings.py配置⽂件添加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'index',
'ranking',
'read',
'search',
'user',
]
TEMPLATES 静待文件配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'novel_db',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
时区语⾔配置:
# 语言
LANGUAGE_CODE = 'zh-Hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
# 上传数据库使用的时间为全世界/False为采用本地时间
USE_TZ = False
静态资源路径配置:
# 配置自定义用户表MyUser
AUTH_USER_MODEL = 'user.MyUser' # AUTH_USER_MODEL
# 静态资源文件路径
STATIC_URL = '/static/'
if DEBUG:
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
else:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 媒体资源的保存路径
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
MEDIAFILES_DIRS = [BASE_DIR / 'media']
三.定义models
1.数据表定义
小说表 Novel
-
书名 book_name
-
作者 author_name
-
更新时间 update_time
-
简介 intro
-
图片(路径) image_url
-
是否完结 state
-
类型 关联 →类型表 novel_type
章节表 Chapter
-
序号 chapter_number
-
章节 chapter
-
内容 chapter_content
-
书名 关联 → 小说表 book_name
类型表 NovelTypes
-
类型 type
动态表 Reading
-
阅读量 reading
-
搜索量 search
-
书名 关联 → 小说表 book_name
书架表 Bookshelf
-
书名 关联→小说表 book_name
-
账号 关联→账号表 user
账号表 MyUser
-
手机号 mobile
-
昵称 nickname
index → models.py
from django.db import models
from user.models import MyUser
class NovelTypes(models.Model):
type = models.CharField('小说类型', max_length=50)
def __str__(self):
return self.type
class Meta:
verbose_name = '小说类型'
verbose_name_plural = verbose_name
class Novel(models.Model):
book_name = models.CharField('书名', max_length=500)
author_name = models.CharField('作者', max_length=500)
update_time = models.CharField('更新时间', max_length=500)
intro = models.CharField('简介', max_length=2000)
image_url = models.FileField('小说封面', max_length=300)
# 在Django当中的约束
state_choice = (
(1, '已完结'),
(2, '连载中...')
)
state = models.SmallIntegerField('状态', choices=state_choice)
novel_type = models.ForeignKey(NovelTypes, on_delete=models.CASCADE, verbose_name='小说类型')
def __str__(self):
return self.book_name
class Meta:
verbose_name = '小说信息'
verbose_name_plural = verbose_name
class Chapter(models.Model):
chapter_number = models.CharField('序号', max_length=100)
chapter = models.CharField('章节', max_length=500)
chapter_content = models.TextField('章节内容', max_length=10000)
book_name = models.ForeignKey(Novel, on_delete=models.CASCADE, verbose_name='书名')
def __str__(self):
return self.chapter
class Meta:
verbose_name = '小说章节'
verbose_name_plural = verbose_name
class Reading(models.Model):
reading = models.IntegerField('阅读次数', default=0)
search = models.IntegerField('搜索次数', default=0)
book_name = models.ForeignKey(Novel, on_delete=models.CASCADE, verbose_name='书名')
def __str__(self):
return self.book_name
class Meta:
verbose_name = '小说动态'
verbose_name_plural = verbose_name
class Bookshelf(models.Model):
book_name = models.ForeignKey(Novel, on_delete=models.CASCADE, verbose_name='书名')
user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='用户')
def __str__(self):
return self.book_name
class Meta:
verbose_name = '我的书架'
verbose_name_plural = verbose_name
user → models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
nickname = models.CharField('昵称', max_length=20)
mobile = models.CharField('手机号', max_length=11, unique=True)
def __str__(self):
return self.nickname
2.数据库迁移
方法一:pycharm 直接迁移
菜单→工具→运行manage.py任务...(Ctrl+Alt+R)
1.执行启动迁移 生成迁移文件 :makemigrations
2.执行迁移提交到数据库 : migrate
方法二:cmd 执行
cd 到项目根目录
1.python manage.py makemigrations # 创建数据结构
2.python manage.py migrate # 迁移结构
四.配置URLs
1,novel → urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls), # django admin后台管理
path('', include('index.urls')), # 首页
path('ranking/', include('ranking.urls')), # 排行
path('read/', include('read.urls')), # 阅读
path('search/', include('search.urls')), # 搜索
path('user/', include('user.urls')), # 账号
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# 用于返回在调试模式下服务文件的 URL 模式的辅助函数
# static 让我们可以正常访问媒体路径
2,index→ urls.py
from django.urls import path
from .views import *
app_name = 'index'
urlpatterns = [
path('', index_views, name='index_views')
]
3,ranking →urls.py
from django.urls import path
from .views import *
app_name = 'ranking'
urlpatterns = [
path('<int:type_id>/<int:page>/', ranking_views, name='ranking_views'),
path('<int:type_id>/', ranking_default, name='ranking_default')
]
4,read→urls.py
from django.urls import path
from .views import *
app_name = 'read'
urlpatterns = [
path('<int:novel_id>/', read_list_views, name='read_list_views'),
path('<int:novel_id>/<int:chapter_number>/', read_views, name='read_views'),
]
5,search→urls.py
from django.urls import path
from .views import *
app_name = 'search'
urlpatterns = [
path('<int:page>/', search_views, name='search_views'),
path('', search_default, name='search_default'),
]
6,user→urls.py
from django.urls import path
from .views import *
app_name = 'user'
urlpatterns = [
path('register/', register_views, name='register_views'),
path('login/', login_views, name='login_views'),
path('home/', home_views, name='home_views'),
path('logout/', logout_views, name='logout_views'),
path('bookshelf/<int:novel_id>/', bookshelf_views, name='bookshelf_views'),
]
五,admin后台管理
user→admin.py
from django.contrib import admin
from index.models import *
from user.models import MyUser
admin.site.register([NovelTypes, Novel, Chapter, Reading, MyUser, Bookshelf])
admin后台管理 超级用户
python manage.py createsuperuser
依次输入用户名(12345678)、邮箱(12345678@qq.com)、密码(00000000) 创建后在网址输入账号密码:http://127.0.0.1:8000/admin/