帮助理解Django视图
我正在尝试遵循上列出的代码 我已经能够理解其中的一小部分。我添加了一些评论,说明我对正在发生的事情的理解 对于我在评论中列出的问题,如果我不能完全理解,我将非常感谢您的帮助帮助理解Django视图,django,Django,我正在尝试遵循上列出的代码 我已经能够理解其中的一小部分。我添加了一些评论,说明我对正在发生的事情的理解 对于我在评论中列出的问题,如果我不能完全理解,我将非常感谢您的帮助 def validate(request, *args, **kwargs): # I thing it is some sort of initializations but I cannot really understand what's happening form_class = kwargs.p
def validate(request, *args, **kwargs):
# I thing it is some sort of initializations but I cannot really understand what's happening
form_class = kwargs.pop('form_class')
defaults = {
'data': request.POST
}
extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {})
kwargs = extra_args_func(request, *args, **kwargs)
defaults.update(kwargs)
form = form_class(**defaults)
if form.is_valid(): #straightforward, if there is no error then the form is valid
data = {
'valid': True,
}
else:
# if we're dealing with a FormSet then walk over .forms to populate errors and formfields
if isinstance(form, BaseFormSet): #I cannot really understand what is BaseFromSet
errors = {}
formfields = {}
for f in form.forms: # I am guessing that this is for when there are multiple form submitted for validation
for field in f.fields.keys(): # I think he is looping over all fields and checking for error. what does add_prefix () return? and what is formfields[]?
formfields[f.add_prefix(field)] = f[field]
for field, error in f.errors.iteritems():
errors[f.add_prefix(field)] = error
if form.non_form_errors():
errors['__all__'] = form.non_form_errors() # what is the '__all__'?
else:
errors = form.errors
formfields = dict([(fieldname, form[fieldname]) for fieldname in form.fields.keys()])
# if fields have been specified then restrict the error list
if request.POST.getlist('fields'): # I am having a hard time understanding what this if statement does.
fields = request.POST.getlist('fields') + ['__all__']
errors = dict([(key, val) for key, val in errors.iteritems() if key in fields])
final_errors = {} # here the author of this code totally lost me.
for key, val in errors.iteritems():
if '__all__' in key:
final_errors[key] = val
elif not isinstance(formfields[key].field, forms.FileField):
html_id = formfields[key].field.widget.attrs.get('id') or formfields[key].auto_id
html_id = formfields[key].field.widget.id_for_label(html_id)
final_errors[html_id] = val
data = {
'valid': False or not final_errors,
'errors': final_errors,
}
json_serializer = LazyEncoder() # Why does the result have to be returned in json?
return HttpResponse(json_serializer.encode(data), mimetype='application/json')
validate = require_POST(validate) # a decorator that requires a post to submit
懒散编码器
class LazyEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, Promise):
return force_unicode(obj)
return obj
这只是拉取关键字参数,form_class
,它是通过URL conf传入的
(r'^SOME/URL/$', 'ajax_validation.views.validate',
{'form_class': ContactForm}, # this keyword argument.
'contact_form_validate')
BaseFormSet
只是在后台执行工作的formset类。当你不知道的时候,搜索来源grep-ri“baseformset”。
这是一个非常宝贵的工具
查看django.forms.formsets
,了解formset\u工厂如何基于BaseFormSet
生成新的“formset”类,从而生成工厂部分
我猜这是针对提交多个表单进行验证的情况
是的,这正是表单集的用途(处理多个表单)
我认为他是在所有领域循环检查错误。add_prefix()返回什么?什么是formfields[]
是的,这将在字段名之间循环
add_prefix()
用于为表单字段名添加特定表单的前缀。因为表单集多次重复表单元素,所以每个字段都需要一个唯一的前缀,例如0-field1
,1-field1
,等等
formfields
只是上面几行定义的一个空字典
什么是“全部”
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
NON_FIELD_ERRORS = '__all__'
与错误[fieldname]
相反,这正是错误字典中存储的非特定于字段的错误(例如跨两个字段的约束)
我很难理解这个if语句的作用
作者留下了一张便条:
# if fields have been specified then restrict the error list
if request.POST.getlist('fields'):
它检查您是否在URLConf中指定了要验证的特定字段,这不是django,而是ajax\u验证
您可以看到,他仅基于指定的字段覆盖了他的错误字典,因此仅对这些字段传递验证
errors = dict([(key, val) for key, val in errors.iteritems() if key in fields])
在这里,这个代码的作者完全失去了我
作者已经将自定义错误和字段字典映射到带有前缀的特定字段名(与通常的表单集不同,每个表单都有自己的错误字典,不知道表单集本身),他可能在AJAX响应中使用该字典来验证所有字段
通常,您可以在表单集上迭代并逐个表单地检查错误,但如果需要通过ajax验证所有错误,则情况并非如此
在大多数情况下,提取html_id的行应该是直接向前的,但它的存在是因为表单小部件可以根据小部件是否为单选(radio select)在id的末尾添加有趣的内容
来源评论:
# RadioSelect is represented by multiple <input type="radio"> fields,
# each of which has a distinct ID. The IDs are made distinct by a "_X"
# suffix, where X is the zero-based index of the radio field. Thus,
# the label for a RadioSelect should reference the first one ('_0').
返回一个名为“callback”的关键字参数(如果传入该参数,则该参数应该是一个接受请求并返回字典的函数),如果不是,则返回一个只返回空字典的lambda函数
我不确定额外上下文的具体用途是什么。您可以使用它运行任意代码片段,而无需修改或子类化ajax\u验证
这只是拉取关键字参数,form_class
,它是通过URL conf传入的
(r'^SOME/URL/$', 'ajax_validation.views.validate',
{'form_class': ContactForm}, # this keyword argument.
'contact_form_validate')
BaseFormSet
只是在后台执行工作的formset类。当你不知道的时候,搜索来源grep-ri“baseformset”。
这是一个非常宝贵的工具
查看django.forms.formsets
,了解formset\u工厂如何基于BaseFormSet
生成新的“formset”类,从而生成工厂部分
我猜这是针对提交多个表单进行验证的情况
是的,这正是表单集的用途(处理多个表单)
我认为他是在所有领域循环检查错误。add_prefix()返回什么?什么是formfields[]
是的,这将在字段名之间循环
add_prefix()
用于为表单字段名添加特定表单的前缀。因为表单集多次重复表单元素,所以每个字段都需要一个唯一的前缀,例如0-field1
,1-field1
,等等
formfields
只是上面几行定义的一个空字典
什么是“全部”
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
NON_FIELD_ERRORS = '__all__'
与错误[fieldname]
相反,这正是错误字典中存储的非特定于字段的错误(例如跨两个字段的约束)
我很难理解这个if语句的作用
作者留下了一张便条:
# if fields have been specified then restrict the error list
if request.POST.getlist('fields'):
它检查您是否在URLConf中指定了要验证的特定字段,这不是django,而是ajax\u验证
您可以看到,他仅基于指定的字段覆盖了他的错误字典,因此仅对这些字段传递验证
errors = dict([(key, val) for key, val in errors.iteritems() if key in fields])
在这里,这个代码的作者完全失去了我
作者已经将自定义错误和字段字典映射到带有前缀的特定字段名(与通常的表单集不同,每个表单都有自己的错误字典,不知道表单集本身),他可能在AJAX响应中使用该字典来验证所有字段
通常,您可以在表单集上迭代并逐个表单地检查错误,但如果需要通过ajax验证所有错误,则情况并非如此
拉html_id的线在大多数情况下应该是直接向前的,但是