赞
踩
在 Django 项目的 setting.py 文件内会有一个如下的配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\', '/'), ], # 添加模板的绝对路径
'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_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static").replace('\\', '/') # 是collect_static 目录的别名 static
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "common_static").replace('\\', '/')
]
这也是笔者配置过的
要理解这两个配置,就要了解 Django 框架的 view.py 视图文件,在视图文件内,Django 会在视图函数内回传一个.html后缀的模板文件,这里就是django 会去第一个配置的路径下找模板,并且找到该指定的html文件名,然后再利用该.html模板文件,去寻找所需的静态文件,如js、css文件等,注意不包括了其他的被继承的.html后缀的模板文件,模板文件就要到 TEMPLATES DIR 路径里去找模板,js、css、图片等等静态文件就要到STATIC_ROOT中找,这里就要用到静态js css渲染等文件路径配置了,看起来会有点模板和静态文件路径重复的感觉,但只要注意 STATIC_URL
、TEMPLATES
和 STATIC_ROOT
这三个配置就好了,这三个是最最关键的,上线要用的,STATICFILES_DIRS
是感觉作用不怎么突出,或许笔者以后会有用到的时候。
使用 STATIC_ROOT
的方法是,在终端执行 python manage.py collectstatic
命令,或者是在 pycharm 中找到 run manage.py Task
,执行 collectstatic
命令,这样 STATIC_ROOT
配置才会生效,将所有 app 里面的所有静态文件都复制到该路径下,方便查找。
表单验证器无法通过验证,但在模型验证器这边却可以通过验证。(下面重点讲解模型验证器)
为什么会这样??
这就要从Django的源码说起!
Django是这么设计的:
模型的验证器不会在调用save()
方法的之前自动执行,且需要手动
表单的验证器会在调用save()
方法的之前自动执行
模型验证:
Django的模型系统models
相关源码中,没有is_valid()
方法,也不会自动调用full_clean()
方法,所以Django不会自动进行模型验证。但是它依然提供了四个重要的验证方法,也就是full_clean()
、clean_fields()
、clean()
和validate_unique()
表单验证:
Django的表单系统forms
的相关源码中,表单在save()
之前会自动执行一个is_valid()
方法,这个方法里会调用验证器
简单点理解,就是如果你在app内新建了一个forms.py文件,在里面编写的就是表单验证器,但如果你是在models.py文件内编写的,那么就算是模型验证器了。
代码实例:
该验证器可以被模型和表单所使用,代码位置也应放置在模型或表单文件内。
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
def validate_even(value):
if value % 2 != 0:
raise ValidationError(
_('%(value)s is not an even number'),
params={'value': value},
)
模型验证器
# models.py
from django.db import models
class MyModel(models.Model):
even_field = models.IntegerField(validators=[validate_even])
表单验证器
# forms.py
from django import forms
class MyForm(forms.Form):
even_field = forms.IntegerField(validators=[validate_even])
模型验证的步骤:
如果你手动调用了full_clean()
方法,那么会依次自动调用下面的三个方法
clean_fields()
:验证各个字段的合法性clean()
:验证模型级别的合法性validate_unique()
:验证字段的独一无二性本质上,后面三个方法是具体实现,full_clean()
是领头羊,实际操作中,你完全可以具体使用其中一个或多个。用了full_clean()
就等于后面三个都用。
模型验证器最最关键的是重写 save()
方法,该方法是每个模型中存在内置方法,所以在每一个需要验证的模型内重写 save()
方法。
模型的save()
方法不会自动调用full_clean()
方法,你必须手动调用。
代码演示:
# models.py from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ def validate_even(value): if value % 2 != 0: raise ValidationError( _('%(value)s is not an even number'), params={'value': value}, ) from django.db import models class MyModel(models.Model): even_field = models.IntegerField(validators=[validate_even]) def save(self, *args, **kwargs): # 重写save方法是关键 try: self.full_clean() super().save(*args, **kwargs) except ValidationError as e: print('模型验证没通过: %s' % e.message_dict)
执行过程展示:
>>> from .models import MyModel
>>> a = MyModel.objects.create(even_field=5)
模型验证没通过: {'even_field': ['5 is not an even number']}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。