安装django
pip3 install django
创建项目
cmd > cd到项目存放目录:
>django-admin startproject [projectName]
创建子APP
cmd:cd 到【projectName】目录里
>python3 manage.py startapp [appName]
添加urls.py文件
app_name = 'Post' # 这里是为了url反向解析用
urlpatterns = [
# 这里放映射的view
]
配置setting.py
#子APP
INSTALLED_APPS = [
# ......
'django.contrib.staticfiles',
'appName',
]
#数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
'mysql': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'MySite',
'USER': 'xxx',
'PASSWORD': 'xxxxx',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
# 语言
LANGUAGE_CODE = 'zh-hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
# 配置HTML模板的路径
TEMPLATES = [{
'DIRS': [os.path.join(BASE_DIR, "templates")],
}]
# 静态文件 js css img 等
STATIC_URL = '/static/' # html 开头{% load static %} src={% static '/img/bg.png' %}
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
# 即项目路径下的media文件夹,没有则自动创建
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
# 这个是在浏览器上访问该上传文件的url的前缀 ‘/media/’
MEDIA_URL = '/media/'
Project 的 urls.py
import appName
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('appName.urls',namespace='appName')),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# 为了网页显示上传的图片/文件
app的urls.py
from django.urls import path
from appName import views
app_name = 'appName'
urlpatterns = [
path(r'', views.index,name='index'),
path(r'^detail/post-(?P<pk>\d+)$', views.detail, name="detail"), # 详情页
]
# html 就可以使用url别名 {% url 'appName:index' %} 方便维护
数据库迁移+实现
https://blog.csdn.net/weixin_40156487/article/details/81512807
迁移
cmd执行:
> python manage.py makemigrations
> python manage.py migrate
创建超级用户
cmd执行:
> python manage.py createsuperuser
# 一定要先迁移再创建
Models
from django.db import models
from django.contrib import admin
class Category(models.Model):
"""分类"""
name = models.CharField(max_length=100)
class Tag(models.Model):
"""标签"""
name = models.CharField(max_length=100)
class Post(models.Model):
"""文章"""
title = models.CharField(max_length=100)
body = models.TextField()
created_time = models.DateTimeField()
modified_time = models.DateTimeField()
excerpt = models.CharField(max_length=200, blank=True) # 文章摘要,可为空
# ForeignKey表示1对多(多个post对应1个category)
category = models.ForeignKey(Category, on_delete=True)
tags = models.ManyToManyField(Tag, blank=True)
views = models.PositiveIntegerField(default=0) # 阅读量
# admin.site.register(Category)
# admin.site.register(Tag)
# admin.site.register(Post) 或者一起写
admin.site.register([Category,Tag,Post])
定义完models.py后,再进行一次迁移。
# 类名=数据库表名,且继承了models.Model,类字段=数据表字段(name),
# AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
# 数据类型则由
CharField(相当于varchar)、
TextField:大文本字段,一般超过4000个字符,
BooleanField:布尔字段,值为True或False。
NullBooleanField:支持Null、True、False三种值
IntegerField:整数。
DecimalField(max_digits=None, decimal_places=None):十进制浮点数。
FloatField:浮点数
DateField[auto_now=False, auto_now_add=False]):日期
TimeField:时间,参数同DateField
DateTimeField:日期时间,参数同DateField
FileField:上传文件字段
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
例: photo = ImageField(upload_to = ‘photos/’)
# DateField(相当于datetime)
关系:
一对多:models.ForignKey() 外键约束
多对多:models.ManyToManyField()
一对一:models.OntoOneField()
null,blank,db_index,default,max_length,primary_key,unique
imkundb
参数:
null=false 是否可以为Null
blank=false 是否可以为空
db_index=false 是否为该参数创建索引
default = 默认值
max_length =30 限制字符长度
primary_key = false 主键,一般和AutoField()一起使用
unique=false 是否唯一值
设置文件存储的路径
即项目路径下的media文件夹,没有则自动创建
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
这个是在浏览器上访问该上传文件的url的前缀
MEDIA_URL = '/media/'
例:
# 路径为“/media/photos/”
photo = ImageField(upload_to = 'photos/')
photo = ImageField(upload_to = 'photos/%Y/%m/%d/')
模板 templates
创建templates目录
![](https://img-blog.csdnimg.cn/img_convert/96013d6225f8b348af07e24ab2b553b2.png#align=left&display=inline&height=174&margin=[object Object]&originHeight=174&originWidth=220&size=0&status=done&style=none&width=220)
index视图
1.在【appName】Post/views.py中实现index方法:
def index(request):
"""
主页
:param request:
:return:
"""
return render(request=request, template_name='Post/index.html')
2.在Post/urls.py中进行路由映射
urlpatterns = [
url(r'^$', views.index, name="index"),
]
3.最后,一定要要修改静态页面中引用的路径。
<ul>
{% for post in post_list %}
<li>{{post.Name}}</li>
{% if(post.isTrue)%}
<a href='{% url 'appName:index' %}'>hello</a>
{% endif %}
{% endfor %}
</ul>
模版继承
基类模板使用占位
{% block content %}
{% endblock %}
子类模板
{% extends 'base.html' %}
{% block content %}
<p>继承了 base.html 文件</p>
{% endblock %}
数据库操作
#insert:
Test(name='runoob').save() #新增
# select:
# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = Test.objects.all() # filter相当于SQL中的WHERE,可设置条件过滤结果
response2 = Test.objects.filter(id=1) # 获取单个对象
response3 = Test.objects.get(id=1) # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
Test.objects.order_by('name')[0:2] #数据排序
Test.objects.order_by("id") # 上面的方法可以连锁使用
Test.objects.filter(name="runoob").order_by("id") # 输出所有数据
for var in list:
response1 += var.name + " "
#update:
# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
test1 = Test.objects.get(id=1)
test1.name = 'Google' test1.save()
# 另外一种方式 #Test.objects.filter(id=1).update(name='Google')
# 修改所有的列 # Test.objects.all().update(name='Google')
# delete:
# 删除id=1的数据
test1 = Test.objects.get(id=1)
test1.delete()
# 另外一种方式
# Test.objects.filter(id=1).delete()
# 删除所有数据 # Test.objects.all().delete()
CORS跨域:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.shortcuts import redirect
# Create your views here.
from app01 import models
import datetime
import json
from django.shortcuts import HttpResponse
from infrastructure.model.enterprise_news_data import Enterprise_news_Data
from infrastructure.model.enterprise_news_data import Enterprise_News_Id_Info_Data
from infrastructure.public import status_info
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def enterprise_news(request):
"""
企业信息
:param request:
:return:
"""
if request.method == 'POST':
ret = Enterprise_news_Data().select_enterprise_news()
return_status = status_info.api_status()
return_status.status["status"] = 0
return_status.status["message"] = "成功"
return_status.status["return_info"] = ret
print(return_status.status)
# return HttpResponse(json.dumps(ret))
response = HttpResponse(json.dumps(return_status.status))
response["Access-Control-Allow-Origin"] = "*"
return response
else:
return HttpResponse()