django源码放在哪里(2023年最新分享)

导读:今天首席CTO笔记来给各位分享关于django源码放在哪里的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

Django-Forms组件之钩子函数源码详解

?一切从这里开始,先留个心

tips:

?form组件校验数据的规则:从上往下依次取值校验;

              校验通过的放到cleaned_data;

              校验失败的放到errors;

⚠️form中所有的字段默认都是必须传值的(required=True);

? 校验数据的时候可以多传数据,多传的数据不会做任何校验,不会影响form校验规则

?前端取消校验form action=\"\" method=\"post\" novalidate

  首先is_valid( )是校验数据的部分,将数据放入is_valid( )开始校验,合格的放在哪里,不合格的放在哪里,因此如果不执行is_valid,是不能执行后面的cleaned_data或者errors,也就是说他是循环每个字段分别去校验,而cleaned_data和errors本质上就是两个字典,用来存放正确的数据和错误的数据。

?总结:学form组件最核心的方法是is_valid( ),最重要的源码也是is_valid(),钩子函数也在is_valid( )中。

详解:首先铺陈一个基础,True and True返回的是True,True and False返回的是False。这里and连接两个返回,前面的self.is_bound返回的一定是True,那么is_valid最后返回True还是False取决于errors到底是空字典还是有键值的,而当errors为空字典,说明没有任何错误,那么not 空就是True,如果errors里面有错误的键值,那么就返回False。

详解:拿到两个初始变量,从逻辑上讲,接下来就是循环当前form类中的所有字段,依次判断输入进来的值和字段规则是否符合,符合就放入cleaned_data字典中,不符合就放入errors字典中。

? tips:看源码时要知道自己该看什么,不要什么都看,只看我们当前逻辑关心的地方

详解:

1、self.fields在类实例化时完成赋值,self.fields={\"name\":name字段对象,\"password\":password字段对象,\"email\":email字段对象},所以name对应的是字段字符串,field对应的是字段对象(也是规则对象),[比如这里就是name:\"name\"  field:name或者name:\"password\" field:password]。

2、往下看到value,这个value指的是传进来的字典的值(比如这里指字典中name的值wpr)。

3、接着是 if isinstance(field,FileField) ,指的是字段对象是否为文件类型,在这里三个属性分别是CharField,CharField,EmailField,没有涉及到文件类型,所以走 value = field.clean(value) 。

4、那就来分析 value = field.clean(value) 指的是用字段对象来校验这个value值,然后将它重新赋值给value,校验通过后加到cleaned_data字典中,name是这个字段字符串,value是这个通过的值,但是如果这里clean校验不通过,就会抛出一个validdation的错误,由于clean是用c语言封装起来的,所以不去深究,只要知道不通过会报错即可。

5、下一句 if hasattr(self, \'clean_%s\' % name): ⚠️是当上面第一层校验通过后 ,再走第二层钩子函数的校验,判断当前类下是否有一个叫 \'clean_%s\' % name名字的方法,如果有就将这个方法取出加个括号来调用这个方法,这时调用第二层钩子方法,得到一个返回值(⚠️? 敲黑板!!注意这里就是为什么在钩子函数中也要返回的原因,但是如果不写也不会报错,这是因为他已经通过了第一层校验,cleaned_data中已经存了那个名字,所以有时不加也没事,但为了防止版本问题产生不必要的bug,还是写上返回值,严谨!!! )

?敲黑板:要第一层校验通过才走钩子函数,如果第一层都没通过,钩子是没用的!!!

6、无论第一次还是第二次校验不通过就会抛出异常 except ValidationError as e:self.add_error(name, e) ,把键和错误信息放入errors中。

7、但是这时有个疑问,从逻辑上讲如果第一层通过了,cleaned_data已经存了正确的键值,那如果第二层不通过,cleaned_data就不应该有这个键值,那么关键就在这个add_error( )中。

8、那我们就进入add_error( )中去一看究竟:

9、那从整体看是通过try except来控制,如果正确放入cleaned_data,如果错误放入errors中。

10、最后只要errors字典里面有键值,就返回False。

? ps:可以将字段对象理解为字段规则/规则对象;

   字典是是无序的(.items),但在最新版本中中将字典变成有序的了,有一个OrderedDict模块,这个字典保证我们的键值是有序的,在我们定义的时候谁是第一个键值,在我们以后用的时候他都是第一个,这就保证了我们校验的时候是有序的来,先校验第一个字段,再依次校验,如果是无序的,for循环的时候都不知道要校验哪一个;

django视图中怎么把从前端获取的user作为全局变量

有时候,我们需要Templates模板页面可以使用一些变量。这些变量我们在views.py响应时没有返回设置的变量。例如,如下代码:

#coding:utf-8

from django.shortcuts import render

def index(request):

context = {}

context[\'title\'] = \'测试标题\'

return render(request, \'index.html\', context)

上面是某个views.py的方法之一。它将渲染index.html模版(Template)页面,并返回context字典。该字典是传入变量信息给前端页面。对应的index.html如下:

 

html

head/head

body

h3{{title}}/h3

p是否登录:{{request.user.is_authenticated}}/p

/body

/html

响应结果除了有title变量值之外,还有是否登录信息。该登录信息来自request变量,问题是上面views.py中返回结果的context中没有写入request变量。而模版也没却有可以获取该变量。

这个当时不是无中生有,我一步一步剖析给大家看。原理讲明白之后,就自然懂得如何设置模版(Templates)的全局变量或者叫默认变量。

render方法是render_to_response方法的简写方式。上面的views.py代码相当于如下:

 

#coding:utf-8

from django.shortcuts import render_to_response

from django.template import RequestContext

def index(request):

context = {}

context[\'title\'] = \'测试标题\'

return render_to_response(\'index.html\', context, RequestContext(request))

如果去掉render_to_response的第三个参数,即RequestContext(request)部分。

渲染index.html模版页面就无法得到{{request.user.is_authenticated}}的值,即没有传递request变量给前端页面。很明显RequestContext很关键。

有关RequestContext的内容可以从Django官方文档查得。

该类实例化时会解析settings中的Templates设置中的context_processors配置。新建Django项目settings.py文件中默认的Templates设置如下:

 

TEMPLATES = [

{

\'BACKEND\': \'django.template.backends.django.DjangoTemplates\',

\'DIRS\': [],

\'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\',

],

},

},

]

大家可发现context_processors有一系列设置,其中根据django.template.context_processors.request的路径找到Django的相关源码。

Django安装在Python的安装目录下Lib/site-packages/目录中,找到django/template/context_processors.py文件,打开可看到request方法:

 

def request(request):

return {\'request\': request}

该方法返回一个字典,key为request,value为request对象。很明显,render中的request对象就是通过加载settings中的context_processors列表方法得到字典项。

我们也可以采用这种方法,给Django项目设置全局的模版变量。例如,我的Django名称为myproject,在myproject/myproject目录中创建一个contexts.py文件,代码如下:

 

#coding:utf-8

from django.conf import settings

# 得到语言设置

def lang(request):

return {\'lang\': settings.LANGUAGE_CODE}

该文件的方法需要request参数,最后需要返回一个字典即可。

再打开settings.py文件,在Templates中添加刚才写的方法引用:

 

TEMPLATES = [

{

\'BACKEND\': \'django.template.backends.django.DjangoTemplates\',

\'DIRS\': [],

\'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\',

# 自定义模版全局变量(默认变量)

\'myproject.contexts.lang\',

],

},

},

]

添加模版全局变量之后,我们可以在任意位置渲染模版页面无需再手动写相关代码即可使用该变量。

django源码放在哪里(2023年最新分享)  第1张

django模板根目录在什么位置?

没明白 如果你说模板应该放在什么位置

那就是在工程下建一个 templates 的文件夹

在自动生成的settings.py里面有配置

官网有文档说明

结语:以上就是首席CTO笔记为大家整理的关于django源码放在哪里的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!

版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023-09-23
下一篇 2023-09-23

相关推荐

发表回复

登录后才能评论