Django常见问题梳理

190 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Django关于图片存储和读取问题

一般情况下,我们上传的图片会保存在 media 这个文件夹下面,在访问网页的时候我们就会读取其中的照片。今天就是来做这样一个例子:


1,在项目的目录下,新建media目录文件,配置setting.py

# 设置上传文件的路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')   #指定根目录

2,在model中配置上传的属性

image = model.ImageField("logo", upload_to='org/%Y/%m',max_length=100)
# 提示, 这里的意思是定义一个上传图片的属性,将文件的内容上传到org/%Y/%m 这个文件件下面,最大的文件名长度是100,%Y是当前的年份创建文件夹,%m是当前的月份创建文件夹

3当前这只是前奏,还有以一系列步骤需要完成,接下来到setting.py 继续进行配置

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',
                # 添加这一行,可以理解为中间件的意思
                'django.template.context_processors.media',
            ],
        },
    },
]

还没有完哟,有人肯定想,真麻烦,还有最后一步 url.py里面配置

      # 处理图片显示的url,使用Django自带serve,传入参数告诉它去哪个路径找,我们有配置好的路径MEDIAROOT
      re_path(r'^media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT}),

Django的Form校验机制

Django在前后端交互的时候经常使用到post提交,而在提交的时候我们经常需要验证表单是否为空,是否长度符合要求
  • 在后台代码里面做过滤潘丹
  • 使用Django的form过滤功能

django的form过滤机制

在这里插入图片描述

例如我们今天就要对这个登录做验证

1,在app下新建 forms.py 文件,添加以下内容

class LoginFrom(forms.Form):
    # 这个字段必须有,没有就报错 required=True
    username = forms.CharField(required=True)
    password = forms.CharField(required=True, min_length=5)

记住这里的命名要和html文件中字段的命名要一致

2,在视图函数中调用

login_form = LoginFrom(request.POST)
        if login_form.is_valid():
            # 字段要一致
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
# 如果输入合法 login-from_is_valid()返回的就是 True            

自定义Django过滤器标签

django的过滤器很多,自带的过滤器能满足我们绝大部分的工作要求,但是当我们有特别的需求的时候就需要自定义了。


创建templatetags文件夹

在这里插入图片描述

注意,这个文件夹的名字是唯一的,不能更改成其他名字,文件夹在创建完成之后会新建一个__init__.py文件,再在此文件夹下面创建一个python文件,这个名字可以自定义

#myfilters.py文件的内容
from django import template
# 创建一个Library类的对象
register = template.Library()

# 自定义过滤器,至少要有一个参数,最多两个参数

@register.filter(name="mod")
def mod(num):
    '''判断num是否为偶数'''
    return num % 2 == 0
@register.filter(name="mod_val")
def mod_val(num,val):
    '''判断nume是否能被val整除'''
    return num%val == 0
  • 过滤器其实就是python的函数
  • 自定义过滤器目前支持1个参数和两个参数的,不支持其他
  • 一个参数就是过滤器前面的变量{% if value|mod%}
  • 完成函数的功能要对函数进行注@register.filter(name="mod_val")
<!DOCTYPE html>
{% load  myfilters %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% for value in values %}
    {% if value|mod %}
        {{value}}是偶数<br>
    {% else %}
        {{value}}是奇数数
    {% endif %}
{% endfor%}
</body>
</html>
  • 调用的时候要先导入过滤器的包{% load myfilters %}
  • 使用的时候还是跟系统的过滤器是一样的用法

Cookies和session

cookie是保存在浏览器中的一段文本信息,例如保存登录过程中的用户名和密码,cookie是可以设置 过期时间,也可以在浏览器中主动的去清除cookie

 # 进行登录验证
    if username =='hongbiao' and password== '123456':
        # 判断是否需要记住用户名
        response = redirect('/index3') # redirect 返回的是一个HttpSponse对象
        if remember =='on':
            # 设置过期时间 这里是1天
            response.set_cookie("username",username,max_age=3600*24*1)
            response.set_cookie("password",password,max_age=3600*24*1)
        return response
        # return redirect('/index3')  HttpResponse
  # 再次登录的时候获取cookie,可以记住用户名和密码   
 
  def login(request):
    # 获取cookie 如果cookie中的存在这个cookie则获取
    if 'username' in request.COOKIES:
        username = request.COOKIES['username']
        password = request.COOKIES['password']
    else:
        username = ''
        password = ''
    return render(request, 'booktest/login.html', {'username':username,'password': password})  

Session是保存在服务器上的一段文本数据,用来进行校验的

def get_session(request):
	# 获取seession
	username = request.session['username']
	password = request.session['password']
	age = request.session['age']
	return HttpResponse(username+':'+password+":"age)
def set_seesion(request):
	# 设置session
	request.session['username'] = 'hongbiao'
	request.session['password'] = '123456'
	request.session['age'] = 'age'
def clear_session(request):
	# 清除session的相关信息
	request.session.clear()
	return HttpResponse("清除成功")

session的相关操作

# 1,以键值对的额形式写session
request.session['键'] = '值'
# 2,根据键值对读取数据
request.session.get('键', '默认值')
# 3, 清除所有的session,在存储中删除部分
request.session.clear()
# 4, 情书session数据,在存储中删除session的整条数据
request.session.flush()
# 5,删除session中的指定键及值,在存储中只删除某个键及对应的值
del request.session[‘键’]
# 6,设置会话时间,如果在没有指定过期事件则两个星期后过期
request.session.set_expiry(value)
# 7,判断是否有这个session
request.session.has_key('isLogin')