帮助理解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的线在大多数情况下应该是直接向前的,但是