安装
pip install django
创建项目
运行
python manage.py runserver
用浏览器打开,出现下面界面,说明成功
生成迁移文件
python manage.py migrate
创建超级用户
python manage.py createsuperuser
按提示输入用户名,密码,邮箱可直接回车跳过
创建成功后即可登录
url:127.0.0.1:8000/admin
登录成功后的界面:
在settings.py中设置中文及时区
现在旧变成中文了
项目案例
- 创建项目
django-admin startproject BlogProject
项目目录说明
settings.py的介绍
2. 配置数据库
- 创建应用
python manage.py startapp blog
2 将新建的应用安装到settings.py中的INSTALLED_APPS中
只要新建应用就必须写进去,可以新建多个应用
- 配置数据库
- 安装pymysql,在BlogProject/init.py中
import pymysql
pymysql.install_as_MySQLdb()
- 记得创建数据库
create database BlogProject DEFAULT CHARSET utf8;
- 写数据库的表及字段,在blog/models.py中
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
class Tag(models.Model):
name = models.CharField(max_length=30, verbose_name="标签名", db_index=True)
class Meta():
db_table = "标签名"
def __str__(self):
return self.name
class Category(models.Model):
name = models.CharField(max_length=30, verbose_name="分类名", db_index=True)
class Meta():
db_table = "分类名"
ordering = ['id']
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=100, db_index=True)
body = models.TextField() # 博客内容
# 创建博客的时间
created_time = models.DateTimeField()
# 最后依次修改博客的时间
modified_time = models.DateTimeField()
# 阅读量
read_num = models.IntegerField(default=0)
# 评论数量
comment_num = models.IntegerField(default=0)
# 标签-博客(多对多),
tags = models.ManyToManyField(Tag)
# 分类-分类(一对多)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
# 博客的创建者名称, 必须是系统存在的用户;
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.title
下面是之前写book表的文件,有一些常见的知识点供参考
from django.db import models
from django.utils.html import format_html
from django.contrib.auth.models import User
# Create your models here.
# 关系: 书籍和英雄====一对多
class BookInfo(models.Model):
# 默认会有主键, 为id并且自增
# 书籍名称: 字符串区域
btitle = models.CharField(max_length=50)
# 书籍的出版日期, 相当于datetime.date.today()
bpub_date = models.DateField()
def __str__(self):
return '%s' %(self.btitle)
class HeroInfo(models.Model):
hname = models.CharField(max_length=30)
# 0: 男 1:女
hgender = models.BooleanField()
hcontent = models.TextField()
# 如果是Django1.x版本, models.ForeignKey(BookInfo);
# 如果是Django2.x版本, models.ForeignKey(BookInfo);
# models.CASCADE: 级联删除, 如果书籍删除了, 书籍里面的英雄也就删除了
# models.DO_NOTHING: 当删除有关联的数据库内容是会报错
# models.SET_NULL:不是级联删除, 如果书籍删除, 那么英雄所属的书籍为Null;
# models.SET_DEFAULT:不是级联删除, 如果书籍删除, 那么英雄所属的书籍为默认值;
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE)
def gender(self):
if self.hgender: # hgender=1
# 设置性别字段的颜色;
return format_html('<span style="color:red">女</span>')
else:
return format_html('<span style="color:green">男</span>')
gender.short_description = '性别'
def __str__(self):
return '%s' %(self.hname)
from django.db import models
# Create your models here.
from datetime import date
from django.db import models
from django.utils import timezone
# 上传文件的编写
class MyBook(models.Model):
name = models.CharField(max_length=100, verbose_name="书籍名称", db_index=True)
# verbose_name: 后台管理的前端页面字段名的中文显示;
# upload_to: 上传的指定位置; 这里是相对位置,(settings文件中必须设置MEDIA_ROOT变量的内容;)
logo = models.ImageField(verbose_name="图书封面", upload_to="modelTest/")
# blank=True, 字段信息可以为空白;
pubdate = models.DateField(db_column="出版日期", verbose_name="出版日期")
read_num = models.IntegerField(null=True, default=0)
class Meta():
# 修改默认的表名为指定的表名(书籍)
db_table = "书籍"
# 默认是升序,
# ordering = ['pubdate']
# 指定按出版日期的降序进行排序;如果出版日期相同, 则按照阅读量进行降序排;
ordering = ['-pubdate', '-read_num']
def __str__(self):
return self.name
# 一个用户可以属于多个组; 一个组里面可以有多个用户; ===========多对多关系
# 用户:
# 组:
# 用户表
class Person(models.Model):
name = models.CharField(max_length=50, verbose_name="姓名")
def __str__(self):
return self.name
# 用户组 类名: Group ----> modelTest_group(数据库表存储的表名)
class Group(models.Model):
name = models.CharField(max_length=50, verbose_name="组名")
# 设置多对多关系,并且必须关联关系表;through
persons = models.ManyToManyField(Person, through='GrouPersons')
# person = models.OneToOneField(Person) # 设置一对一关系
def __str__(self):
return self.name
# 我想记录某个用户加入某个组的时间和原因;
class GrouPersons(models.Model):
# 级联不删除, 默认设置为空;
person = models.ForeignKey(Person, on_delete=models.SET_NULL, null=True)
group = models.ForeignKey(Group, on_delete=models.SET_NULL, null=True)
date_joined = models.DateField(default=timezone.now()) # 某个用户加入某个组的日期;
join_reason = models.CharField(max_length=200) # 某个用户加入某个组的原因;
def __str__(self):
return "%s-%s" %(self.group, self.person)
#
# >>> person2 = Person(name="小明")
# >>> person1 = Person(name="张三")
# >>> group1 = Group(name = "Linux兴趣小组")
# >>> group2 = Group(name = "python兴趣小组")
# >>> person1.save()
# >>> person2.save()
# >>> group1.save()
# >>> group2.save()
# >>> r1 = GrouPersons(person=person1, group=group1, join_reason='好玩')
# >>> r1.save()
# >>> group1.persons.all()
# <QuerySet [<Person: 张三>]>
# >>> r2 = GrouPersons(person=person1, group=group2, join_reason='好玩')
# >>> r2.save()
# >>> group2.persons.all()
# <QuerySet [<Person: 张三>]>
# >>> person1.group_set.all()
# <QuerySet [<Group: Linux兴趣小组>, <Group: python兴趣小组>]>
- 执行命令
创建更改的文件
python manage.py makemigrations
将生成的py文件应用到数据库
python manage.py migrate
开始和前端页面交互
- 新建static等文件,如下
- 在blog下面建一个urls.py文件
from django.urls import path
from blog.views import index
urlpatterns = [
path('',index,name='index'),
]
- 写业务逻辑在视图函数blog/views.py
from django.shortcuts import render
# Create your views here.
from blog.models import Post
def index(request):
return render(request, 'blog/index.html')
- 在BlogProject/urls.py中加入blog.urls
5. 在配置文件中
加入templates文件位置
加入static文件位置
6. 运行
python manage.py runserver
http://127.0.0.1:8000/blog/
- 在blog/admin.py中
凡是要想要用站点管理的数据表都要写进来
from django.contrib import admin
# Register your models here.
from blog.models import Tag, Post, Category
admin.site.register(Tag)
admin.site.register(Category)
admin.site.register(Post)