Django的Form体制详细说明
自然环境:Python 2.7.5 Django 1.6
应用Django,我们可以以申明式的方法来界定一个Form,如下所示:
# -*- coding: utf-8 -*- from django import forms class SimpleForm(forms.Form): field_a = forms.CharField(max_length=100) field_b = forms.CharField(max_length=100)
写起來很舒服,可是那么问题来了,当我将这一Form复位以后,例如:
from polls.forms import SimpleForm
sf = SimpleForm({'field_a':'value of field_a', 'field_b':'value of field_b'})
随后在python shell里实行dir(sf),发觉该案例并沒有field_a和field_b这两个特性,显而易见大家就无法像sf.field_a那么来引入sf上的字段名了。但是本来我们可以在template里以{{ form_name.field_name }}的类型来引入form的字段名,这是怎么一回事呢?
一番调研以后发觉身后的完成体制还较为坎坷。最先,假如我们要引入form里的字段名应该怎么写呢?应当那么写:sf['field_a']
为何要那么写呢?上编码,django.forms.BaseForm的._getitem__方式:
def ._getitem__(self, name): "Returns a BoundField with the given name." try: field = self.fields[name] except KeyError: raise KeyError('Key %r not found in Form' % name) return BoundField(self, field, name)
那样就把BaseForm变为一个像dict一样的的器皿了,因此可以用上边的英语语法来引入form里的字段名。
新的问题来了,为何可以在template里以{{ form_name.field_name }}的类型来引入form的字段名呢?见Django的官方网文本文档:https://docs.djangoproject.com/en/1.6/topics/templates/#variables。原先Django的模板引擎遇到{{ form_name.field_name }}那样的关系式,会在form_name目标上运作词典搜索,因此模板引擎对{{ sf.field_a }}求值时事实上运作了sf['field_a'],水落石出了。
此外,上文章中的SimpleForm的种类事实上是django.forms.DeclarativeFieldsMetaclass。这一元类事实上是把SimpleForm中以申明式英语的语法申明的全部字段名(还包含成员变量中的证明式字段名)根据get_declared_fields方式转化成了一个dict,并将dict的值赋给了即将转化成的类的base_fields属性,随后根据SimpleForm转化成了一个新的类。
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。