我在使用Django出现的问题

外键。

关联关系model
CASCADE 级联删除set_null
on_delete

django与mysql版本不兼容问题

# setting 中开头导入这两句话

from django.db.backends.mysql.base import DatabaseWrapper

DatabaseWrapper.data_types['DateTimeField'] = "DateTime"

新建项目setting设置

TEMPLATES = [
    'DIRS': [os.path.join(BASE_DIR,'templates')]
]

INSTALLED_APPS-----中挂载APP

DATABASES ----增加数据库信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day4',# 数据库名字
        'HOST': 'localhost',# 主机名
        'PORT': 3306,# 端口号
        'USER': 'root',# 用户名
        'PASSWORD': 'root',# 密码
    }
}

新建APP指令

# 控制台:Terminal中输入
python manage.py startapp app名字(模块的名字)
# 完成后要在setting中挂载

model模型写完

python manage.py makemigrations				生成迁移文件
python manage.py migrate					执行

新建的test模块

# 首先要导入一个包
import os, django
# 自己manage.py文件中的第六行代码(导入setting)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_day4.settings')
django.setup()


# 必须放在所有代码开头,不然报错

查询的一些方法

all()------得到的是所有的QuerySet对象
all().value()-----得到表中的所有数据
	value括号中可以写需要获取的值
get()------得到的是object 对象
可以通过对象.方法.属性得到数据

form表单中要加

{%csrf_token%}

form表单get、post

post的提交方式不会在url中显示参数;
可以通过request.POST.get方式来获取提交的数据。

get提交的参数会在url中显示;
可以通过request.GET.get的方法来获取提交的参数。

# 方法get()
根据键获取值,只能获取键的一个值
如果一个键同时拥有多个值,获取最后一值(因为覆盖了哦!)
# 方法getlist()------多选框
根据键获取值将键的值以列表返回
可以获取一个键的多个值


# 请求方式总结
1. get从服务器获取数据,不会更改服务器的状态和数据,在url中携带参数发给服务器
2. post则是将一定量的数据发送给服务器,一般会更改服务器的数据
3. post方法的参数不能再url中看到,他是通过body参数传递给服务器,相对于get方法,更加安全,

事务管理

1. with transaction.atomic():
	·	with中的代码回滚
2.    # 给当前项目中所有的视图都添加了事务控制
        # 'ATOMIC_REQUESTS': True
    setting中database中加入

session在setting中的设置

# 修改session默认的有效期为一次会话SESSION_EXPIRE_AT_BROWSER_CLOSE = True

APP中新建的urls.py文件

 path('home/', include('home.urls')),
 
 urlpatterns = [
    path('index/', views.index),
]

模板设置

TEMPLATES = [# 指定查找html文件的默认位置'DIRS'='']

a禁止跳转

<a href="javascript:void(0)" onclick="">删除</a># 禁止跳转

明显注释

#TODO

从头开始流程步骤

1. setting
		os.path.join()
2. model
		class User(models.Model):
            username = models.CharField()
            class Meta:
                db_table = 'bz_user'
3. 

上传时涉及文件

1. form表单必须指定enctype属性,
	enctype = 'multipart/form-data',否则,FILES将为一个空的类似于字典的对象。
	<form method="post" action="" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" name="file"><br>
        <input type="submit" value="上传">
    </form>
2. models需要指定文件上传
		字段属性FileFiled或ImageField
    	指定upload-to属性,上传到哪
    
3. views视图中
		要用 request.FILES.get()接收
	
4. 图片上传的位置上(setting设置):
	# 1
		该方法是在项目的主目录下新建media文件夹,models.py中会指定
		sculpture = models.ImageField(upload_to="pics")
		最终图片会存储到media>pics中
		
		MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
 # 2 
 	如果在主目录下创建static>media.
 	则setting中设置:
    	MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')

5. 数据库中存的是相对路径
	
6. 存的同名的图片时(对文件进行重命名):
		使用uuid

static

项目的静态资源

media

用户上传的静态资源

分页步骤、属性、方法、实现

paginator


# 分页器属性
	1. count
	2. num_pages
	3. page_range
# 分页器方法
	1. page()~~~



### 上传的头像前端展示(图片回显)

~~~markdown
1. 图片放在主目录下的media>pics	中
2. django寻找静态资源
	setting中设置:
		1. # 配置用户上传文件|图片的实际储存位置
			MEDIA_ROOT = os.path.join(BASE_DIR, 'media')	
		2. # 将MEDIA_ROOT设置为Django静态资源查找目录
                STATICFILES_DIRS = [
                    os.path.join(BASE_DIR, 'static'),
                    MEDIA_ROOT,
                ]
		
3. html页面展示的两种方法:
	1. <td><img src="/static/{{ user.sculpture }}" alt="无法加载" width="50px" height="30px"></td>

	2.加一个static标签(加载静态资源目录)
	{% load static %}
	<td><img src="{% static user.sculpture.url %}" alt="无法加载" width="50px" height="30px"></td>
	

分页实现


后台管理setting设置编码时区

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'


# 改成:
LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

admin后台管理

# 访问网址
	127.0.0.1:8080/admin
# 用户名、密码、邮箱
	运行命令
	python manage.py createsuperuser
	按提示输入用户名、邮箱、密码(小提示:密码最少8位,不能是纯数字/字符)
# 向admin中注册模型
	在app里面有个admin.py的文件,在这个文件中注册需要在后台管理页面显示的模型。如果不注册则不会显示
	admin.site.register(Department)
	admin.site.register(Student)
# 1.列表页属性:

    list_display:显示字段,可以点击列头进行排序;

    list_filter:过滤字段,过滤框会出现在右侧;

    search_fields:搜索字段,搜索框会出现在上侧;

    list_per_page:分页,分页框会出现在下侧。
# 添加、修改页属性:

    fields:属性的先后顺序

    fieldsets:属性分组
    
# 如何修改后台管理系统的字段显示名?
	通过对对应的模型类中对应字段设置verbose_name="指定要显示的字段名"实现!

中间件方法

1. process_request(self,request) :
		执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
2. process_view(self, request, callback, callback_args, callback_kwargs):
		调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
3. process_template_response(self,request,response):
		在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
4. process_exception(self, request, exception)
		当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
5. process_response(self, request, response)
		所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象



# 激活中间件
	MIDDLEWARE = [
		'uploadapp.mymiddleware.MyMiddleware',
		   app名字			   中间件名字
	]

设置获取和删除cookies

# 在谷歌浏览器上,登录了CSDN之后,查看网址左边的那个锁,就可以看到CSDN在你本地浏览器中存储的cookie信息!

# 
response = HttpResponse('设置cookie')
response.set_cookie('name', 'xiaoming ')   # 默认关闭浏览器则过期
response.set_cookie('name', 'xiaoming', max_age=100)  # 100s后过期
return response

# 或者
username = request.POST.get('username')
response = redirect('user:index')
response.set_cookie('username', username, max_age=60 * 5)
return response

# 删除cookies
def delete(request):
    rs = HttpResponse('删除cookie')
    rs.delete_cookie('name')
    return rs
    
 # 注意
 	设置cookie值以及删除cookie值都是response对象的操作,而获取cookie是从requeset相应中获得的。
	虽然cookie可以保存状态但注意不要存储敏感信息(密码)。

session之状态保持

# 引言
1. cookie的键和值都是明文的形式存储在客户端浏览器上,很不安全!
2. 存储方式包括cookie,session,会话一般指session对象。
3. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息。
4. 使用session方式,所有数据存储在服务器端(以键值对形式存储),在客户端cookie中存储	session_id,用户的重要信息是不会存储在客户端的,下次用户登录只需校验session_id即可,安全!!!
5. 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据。
	注意:不同的请求者之间不会共享这个数据,与请求者一一对应。
	
# session 依赖于cookie
cookie本身最大支持4096字节。保存在客户端,会被拦截或窃取。
# session特点
1. session是以键值对进行存储的
2. session依赖于cookie,唯一标识码sessionid  保存在cookie中
3. session也有过期时间~~~

~~~markdown
# 使用
使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表
# setting中设置
    1. app挂载
    2. session中间件
 # 数据库字段
    1.  session_key(就是上面所说的session_id);
    2.  session_data(就是对应的用户的隐私数据);
    3.  expire_date(就是session的过期时间)
    
# session简单操作
启用会话后,每个HttpRequest对象将具有一个session属性,它是一个既可读又可写的类似于字典的对象,表示当前的会话。

1. get(key, default=None):根据键获取会话的值

2. flush():删除当前的会话数据并删除会话的Cookie


# 设置session
        request.session["name"] = "xiaoming"
        request.session.set_expiry(100)       #设置过期时间,单位为秒。到时间则自动删			除。 (比如你网页登录12306,多久时间内再次登录可不用重新登录!)
 # 对session的访问,只能在服务端获取!
        name = request.session.get("name","未登录")        #第二个参数为默认值。如果获取的键不存在则显示默认值。
        print(name)	
   # 对session的删除   (比如网页中登录12306之后,你退出!)
        request.session.flush()清除session所有数据,清除表中的数据及cookie中的sessionid
        request.session.clear()清除了session_date中的键值对,但session表中的记录还在
        del request.session[key]删除指定的session中的某一个键值
        return HttpResponse("完成!")~~~



### model模型

https://www.cnblogs.com/suraer/p/8515416.html




### 使用admin管理表单时admin.py添加

admin.site.register(models.User)




### path路径问题

~~~markdown
、
re_path(r'^$', views.index,name='index'),
path('',views.index,name='index'),

两个一个意思
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值