form_class = kwargs.pop('form_class')
Это просто извлечение аргумента ключевого слова 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_factory
создает новые классы "formset" на основе BaseFormSet
, отсюда и заводская часть!
Я предполагаю, что это для случаев, когда для проверки подано несколько форм
Да, именно для этого предназначен набор форм (работа с несколькими формами)
Я думаю, что он просматривает все поля и проверяет наличие ошибок. что возвращает add_prefix ()? а что такое formfields []?
Да, это будет цикл по именам полей.
add_prefix()
- для префикса имен полей формы определенной формы. Поскольку набор форм повторяет элементы формы несколько раз, каждому полю требуется уникальный префикс, такой как 0-field1
, 1-field1
и т. Д.
formfields
- это просто пустой словарь, определенный несколькими строками выше.
что такое ' все '?
__all__
определяется в верхней части django.forms.forms
NON_FIELD_ERRORS = '__all__'
Это просто то, что не связанные с полем ошибки (например, ограничения для двух полей) хранятся в словаре ошибок, а не errors[fieldname]
.
Мне трудно понять, что делает это утверждение if.
Автор оставил записку:
# if fields have been specified then restrict the error list
if request.POST.getlist('fields'):
Он проверяет, указали ли вы какие-либо конкретные поля для проверки в вашем URLConf, это не django, а ajax_validation
.
Вы видите, что он перезаписывает свой словарь ошибок, основываясь только на указанных полях, таким образом передавая проверку только для этих полей.
errors = dict([(key, val) for key, val in errors.iteritems() if key in fields])
здесь автор этого кода полностью потерял меня.
Автор сопоставил пользовательский словарь ошибок и полей с конкретными именами полей с префиксами (в отличие от обычного FormSet с каждой формой, имеющей собственный словарь ошибок, не подозревающий о самом наборе форм), который он предположительно использует в ответе AJAX. проверить все поля.
Как правило, вы можете перебирать набор форм и просматривать ошибки в каждой форме, но это не так, если вам нужно проверить все из них с помощью ajax.
Строка вытягивания html_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').
Почему результат должен быть возвращен в json?
Потому что это ajax-запрос, а javascript легко съедает json.
2 - не могли бы вы пройти через эти строки кода ...
extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {})
Либо возвращает аргумент ключевого слова с именем 'callback' (который, если он передается, должен быть функцией, которая принимает request
и возвращает словарь), а если нет, возвращает лямбда-функцию, которая возвращает только пустой словарь.
Я не уверен, что конкретно используется для дополнительного контекста. Вы можете использовать его для запуска произвольных фрагментов кода без изменения или подкласса ajax_validation
...