当前位置:   article > 正文

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

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',
            ],
        },
    },
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上面是笔者自己配置过的,还有一个静态文件路径的配置,如下所示:

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('\\', '/')
]
  • 1
  • 2
  • 3
  • 4
  • 5

这也是笔者配置过的

要理解这两个配置,就要了解 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},
        )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

模型验证器

# models.py
from django.db import models

class MyModel(models.Model):
    even_field = models.IntegerField(validators=[validate_even])
  • 1
  • 2
  • 3
  • 4
  • 5

表单验证器

# forms.py
from django import forms

class MyForm(forms.Form):
    even_field = forms.IntegerField(validators=[validate_even])
  • 1
  • 2
  • 3
  • 4
  • 5

模型验证的步骤:

如果你手动调用了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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
执行过程展示:

>>> from .models import MyModel
>>> a = MyModel.objects.create(even_field=5)
模型验证没通过:  {'even_field': ['5 is not an even number']}
  • 1
  • 2
  • 3
  • 4
  • 5

参考链接

验证器

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/489498
推荐阅读
相关标签
  

闽ICP备14008679号