Django:
安装Django
pip3 install django
创建Django工程
django-admin startproject projectName
projectName
- projectName # 对整个程序进行配置
- init
- settings # 配置文件
- url # URL对应关系
- wsgi # 遵循WSIG规范,uwsgi + nginx
- manage.py # 管理Django程序:
- python manage.py
- python manage.py startapp xx
- python manage.py makemigrations
- python manage.py migrate
运行Django功能
python manage.py runserver 127.0.0.1:8001
创建app
cd [project]
python manage.py startapp submit
app:
migrations 数据修改表结构
admin Django为我们提供的后台管理
apps 配置当前app
models ORM,写指定的类 通过命令可以创建数据库结构
tests 单元测试
views 业务代码
同一目录下创建templates和static 文件夹并在setting文件中配置参数,增加templates中的'DIRS'值,增加static路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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',
],
},
},
]
配置静态目录static,用于存放css和js,html中引用需要<link rel="stylesheet" href="../../static/css/style.css">
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
settings.py中注释csrf
middlerware #中继器
定义路由规则在url.py中配置路由
"login" --> view.函数名
定义视图函数
app下views.py
def func(request):
# request.method GET / POST
# http://127.0.0.1:8009/home?nid=123&name=Doltt
# request.GET.get('',None) # 获取请求发来的而数据
# request.POST.get('',None)
# return HttpResponse("字符串") # 直接回应字符串
# return render(request, "HTML模板的路径") #渲染模板
# return redirect('/只能填URL')
模板渲染
特殊的模板语言:
-- {{ 变量名 }}
def func(request):
return render(request, "index.html", {'varName': "Doltt"})
- 例子:
//index.html
<html>
..
<body>
<div>{{varName}}</div>
</body>
</html>
- 在后台requset最后生成的字符串
<html>
..
<body>
<div>Doltt</div>
</body>
</html>
For循环
def func(request):
return render(request, "index.html", {'current_user': "Doltt", 'user_list': ['Doltt','eric']})
- 例子:
//index.html
<html>
..
<body>
<div>{{current_user}}</div>
<ul>
{% for row in user_list %}
{% if row == "Doltt" %}
<li>{{ row }}</li>
{% endif %}
{% endfor %}
</ul>
</body>
</html>
索引
def func(request):
return render(request, "index.html", {
'current_user': "Doltt",
'user_list': ['Doltt','eric'],
'user_dict': {'k1': 'v1', 'k2': 'v2'}})
- 例子:
//index.html
<html>
..
<body>
<div>{{current_user}}</div>
<a> {{ user_list.1 }} </a>
<a> {{ user_dict.k1 }} </a>
<a> {{ user_dict.k2 }} </a>
</body>
</html>
条件
def func(request):
return render(request, "index.html", {
'current_user': "Doltt",
"age": 18,
'user_list': ['Doltt','eric'],
'user_dict': {'k1': 'v1', 'k2': 'v2'}})
- 例子:
//index.html
<html>
..
<body>
<div>{{current_user}}</div>
<a> {{ user_list.1 }} </a>
<a> {{ user_dict.k1 }} </a>
<a> {{ user_dict.k2 }} </a>
{% if age %}
<a>有年龄</a>
{% if age > 16 %}
<a>老男人</a>
{% else %}
<a>小鲜肉</a>
{% endif %}
{% else %}
<a>无年龄</a>
{% endif %}
</body>
</html>
连接mysql
- 修改配置文件setting.py的数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
- 在project目录下的init.py文件中添加代码:(Django默认使用MySQLdb模块链接MySQL)
import pymysql
pymysql.install_as_MySQLdb()
- 修改数据库对应的App的models.py文件
from django.db import models
# 定义一个类为表名
# Create your models here.
class Sciencenews(models.Model):
id = models.CharField(max_length=36,primary_key=True)
first_module = models.CharField(max_length=30,default="News")
second_module = models.CharField(max_length=30,default="Latest News")
title = models.CharField(max_length=300)
author = models.CharField(max_length=60,null=True)
publish_date = models.CharField(max_length=35,null=True)
content = models.TextField(null=True)
crawl_date = models.CharField(max_length=35,null=True)
from_url = models.CharField(max_length=350,null=True)
以上的TableName类名代表数据库的表名且继承了models.Model,类里面的字段代表数据表中的userName,数据类型由CharField(相当于varchar)、DateField(相当于datetime),max_length参数限定长度
- 增加配置文件setting.py中的INSTALL_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'AppName',
]
- 执行命令创建数据库表
改动了model.py的内容之后执行makemigrations相当于在该app下建立migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py没有作用到数据库文件;执行migrate该改动作用到数据库文件,比如产生table之类
python manage.py makemigrations
python manage.py migrate
- 数据库中的表名为App名_Class名
app_className
前端获取值并传递后台
ORM执行mysql操作
-
字段:
字符串类型
数字
时间
二进制
自增(primary_key=True) -
字段的参数:
null -> db是否可以为空
default -> 默认值
primary_key -> 主键
db_column -> 列名
db_index -> 索引
unique -> 唯一索引
unique_for_date ->
unique_for_month
unique_for_year
auto_now -> 创建时,自动生成时间
auto_now_add -> 更新时,自动更新为当前时间
# obj = UserGroup.objects.filter(id=1).update(caption='CEO')
# obj = UserGroup.objects.filter(id=1).first()
# obj.caption = "CEO"
# obj.save()
choices -> django admin中显示下拉框,避免连表查询
blank -> django admin是否可以为空
verbose_name -> django admin显示字段中文
editable -> django admin是否可以被编辑
error_messages -> 错误信息欠
help_text -> django admin提示
validators -> django form ,自定义错误信息(欠)
创建 Django 用户:python manage.py createsuperuser
- 根据类对数据库表中的数据进行各种操作
一对多:
a.
外键
b.
外键字段_id
c.
models.tb.object.create(name='root', user_group_id=1)
d.
userlist = models.tb.object.all() for row in userlist: row.id row.user_group_id row.user_group.caption
- 给用户返回数据:
render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
redirect("URL")
HttpResponse(字符串)
- 基本增删改查操作
- 增
models.User.objects.create(name='qianxiaohu',age=18)
dic = {'name': 'xx', 'age': 19}
models.User.objects.create(**dic)
obj = models.User(name='qianxiaohu',age=18)
obj.save()
- 删
models.User.objects.filter(id=1).delete()
- 改
models.User.objects.filter(id__gt=1).update(name='Doltt',age=84)
dic = {'name': 'xx', 'age': 19}
models.User.objects.filter(id__gt=1).update(**dic)
- 查
models.User.objects.filter(id=1,name='root')
models.User.objects.filter(id__gt=1,name='root')
models.User.objects.filter(id__lt=1)
models.User.objects.filter(id__gte=1)
models.User.objects.filter(id__lte=1)
models.User.objects.filter(id=1,name='root')
dic = {'name': 'xx', 'age__gt': 19}
models.User.objects.filter(**dic)
v1 = models.Business.objects.all()
# QuerySet ,内部元素都是对象
# QuerySet ,内部元素都是字典
v2 = models.Business.objects.all().values('id','caption')
# QuerySet ,内部元素都是元组
v3 = models.Business.objects.all().values_list('id','caption')
# 获取到的一个对象,如果不存在就报错
models.Business.objects.get(id=1)
对象或者None = models.Business.objects.filter(id=1).first()
- 外键:
v = models.Host.objects.filter(nid__gt=0)
v[0].b.caption ----> 通过.进行跨表
class UserType(models.Model):
caption = models.CharField(max_length=32)
id caption
# 1,普通用户
# 2,VIP用户
# 3, 游客
----
class User(models.Model):
age = models.IntergerFiled()
name = models.CharField(max_length=10)#字符长度
# user_type_id = models.IntergerFiled() # 约束,
user_type = models.ForeignKey("UserType",to_field='id') # 约束,
name age user_type_id
# 张扬 18 3
# 张A扬 18 2
# 张B扬 18 2
position:fixed absolute relative
Ajax
$.ajax({
url: '/host',
type: "POST",
data: {'k1': 123,'k2': "root"},
success: function(data){
// data是服务器端返回的字符串
var obj = JSON.parse(data);
}
})
建议:永远让服务器端返回一个字典
return HttpResponse(json.dumps(字典))
网友评论