杂项 - 对于Django 的静态文件路径配置和模板配置路径理解 - 表单验证器和模型验证器 - 个人理解

对于Django 的静态文件路径配置和模板配置路径理解

在 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_URLTEMPLATESSTATIC_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()方法,那么会依次自动调用下面的三个方法

  1. clean_fields():验证各个字段的合法性
  2. clean():验证模型级别的合法性
  3. 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']}

参考链接

验证器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值