Django学习随笔
Django的学习资料网上已能找到很多,本文仅记录学习过程中遇到的一些问题
虚拟环境搭建
这个直接搜索即可,有很多资料: django虚拟环境搭建.
应用和项目的区别
在Django目录下执行
python manage.py startapp/startroject 应用名/项目名
将创建应用或项目,项目和应用有什么区别?
应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,或者小型的投票程序。项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被很多个项目使用。
如果在主项目下创建了新的项目或应用,需要在主项目的setting.py的INSTALLED_APPS列表里添加项目或应用名。
主项目的urls.py的urlpatterns列表也要包含path(‘url’, include(‘子项目.urls’))
from django.contrib import admin
from django.urls import path,include
数据库操作
在modes.py中进行修改后,在Django目录下执行
python manage.py makemigrations #生成数据库迁移文件,数据库未更改
python manage.py migrate #执行数据库迁移,数据库将更改
modes.py中每个继承models.Model的类都将是数据库中的一个表,models位于django.db中。modes.py中定义的类不需要指定主键,django将自动为其指定主键。
若要使用MySQL数据库,需要在命令行执行pip install pymysql
安装pymysql,并在setting.py中加入以下代码,将默认数据库设置为MySQL
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 3306,
'NAME': 'djangodb',
'USER': 'root',
'PASSWORD': 'root',
}
}
若提示版本错误,可在__init__.py加入以下代码
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
在某个数据库查找时,可用表名.objects.get(列名=值)
获得某个元素,表明.objects.filter(列名=值)
获得某些元素
要配合except 表名.DoesNotExist:
使用,若不存在相应元素,则进入异常处理。
时区和语言
在setting.py中写入以下代码,将时区设置为东八区,语言设置为简体中文
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
static目录
假设项目路径下有statics目录,用于保存资源文件,可将static目录设定为statics,在模板中可直接用{% load static %}
在setting.py加入以下代码
import os
STATIC_URL = '/statics/'
STATIC_ROOT = os.path.join(BASE_DIR, '/statics/').replace('\\', '/')
STATICFILES_DIRS = [(os.path.join(BASE_DIR, 'statics'))]
Views
views.py的一些引用
以后继续补充
from django import views
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404, get_list_or_404, HttpResponse
views响应方式
若以单个函数响应URL请求,则函数形式为def func(request):
可在函数体内判断request是get还是post请求。以这种方式响应的话,urls.py的urlpatterns列表中可直接写path('链接的URL', views.func, name='URL的名字')
若view处理逻辑复杂,则可以使用面向对象的方式实现。在views.py中引用from django import views
,定义类 class Test(views.View)
,并为该类定义get
和post
函数def get(request):
,def post(request):
,urls.py的urlpatterns列表中写path('链接的URL', views.Test.as_view(), name='URL的名字')
以上"URL的名字",可在模板中使用href="{% url 'URL的名字' 参数 %}"
若URL存在参数,则views中的get和post函数必须接受同名参数
django ajax
模板中需要引用https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js
或者将js.cookie.js
下载到本地
完整版的https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.js
百度的jquery源https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js
https://apps.bdimg.com/libs/jquery/2.1.4/jquery.js
官网源很慢 https://code.jquery.com/jquery-3.5.1.js
前端提供一些控件,定义其id属性
在模板中
<script>
$('#btncountry').click(function () { //btncountry是按钮的id,click注册其单击函数
var csrf = Cookies.get('csrftoken') //获得CSRF Token
console.log('前端发出了country')
$.ajax({
type: 'POST',
url: {% url 'test' %},//要提交到的URL
data: {
country: $('#inputcountry').val(),
csrfmiddlewaretoken: csrf //待提交的数据
},
success: function (result, status) {
alert(result) //成功提交后 后端返回的数据在Result里
},
error: function (result, status) {
//失败提交后 后端返回的数据在Result里
}
})
})
</script>
若前端需返回列表,字典等复杂数据结构,可使用json方式,前端使用JSON.stringify
,后端使用json.loads
后端的代码,在post函数中,request是post的参数
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404, get_list_or_404, HttpResponse
if 'country' in request.POST:
return JsonResponse(data='后台收到了country', safe=False)
#若后端返回的data为字符串等非json格式的数据,safe=False
#若safe=True,则data必须为dict格式(json)
若使用form提交表单,则form中所有具有name属性的元素值(value)都将被提交