Мне нравится решение для закрытия за то, что оно было "инструментом для очистки" и большим количеством Pythonic (так +1 к ответу mmarshall), но формы Django также имеют механизм обратного вызова, который можно использовать для фильтрации querysets в formsets.
Это также не документируется, который я думаю, индикатор, Django devs не мог бы понравиться он так же.
, Таким образом, Вы в основном создаете свой formset то же, но добавляете обратный вызов:
ServiceFormSet = forms.formsets.formset_factory(
ServiceForm, extra=3, formfield_callback=Callback('option', affiliate).cb)
Это создает экземпляр класса, который похож на это:
class Callback(object):
def __init__(self, field_name, aff):
self._field_name = field_name
self._aff = aff
def cb(self, field, **kwargs):
nf = field.formfield(**kwargs)
if field.name == self._field_name: # this is 'options' field
nf.queryset = ServiceOption.objects.filter(affiliate=self._aff)
return nf
Это должно дать Вам общее представление. Это - немного более сложное создание обратного вызова метод объекта как это, но дает Вам немного больше гибкости в противоположность выполнению простого функционального обратного вызова.
Я думаю, вы можете использовать функции обработки ошибок libxml
для этого:
libxml_use_internal_errors ()
, чтобы переключиться на обработку ошибок пользователя libxml_get_errors ()
для извлечения ошибок из буфера ошибок libxml
; это вернет массив libXMLError
объектов libxml_clear_errors ()
, чтобы очистить буфер ошибок libxml
Простой пример:
$file = 'test.xml';
$schema = 'test.xsd';
$dom = new DOMDocument;
$dom->load($file);
libxml_use_internal_errors(true);
if ($dom->schemaValidate($schema)) {
print "$file is valid.\n";
} else {
print "$file is invalid.\n";
$errors = libxml_get_errors();
foreach ($errors as $error) {
printf('XML error "%s" [%d] (Code %d) in %s on line %d column %d' . "\n",
$error->message, $error->level, $error->code, $error->file,
$error->line, $error->column);
}
libxml_clear_errors();
}
libxml_use_internal_errors(false);
Если вам нужно только распечатать, вы можете определить свой собственный обработчик ошибок , чтобы распечатать ошибку.