1 | Index: django/db/models/fields/__init__.py
|
---|
2 | ===================================================================
|
---|
3 | --- django/db/models/fields/__init__.py (revision 7538)
|
---|
4 | +++ django/db/models/fields/__init__.py (working copy)
|
---|
5 | @@ -1157,6 +1157,11 @@
|
---|
6 | self.schema_path = schema_path
|
---|
7 | Field.__init__(self, verbose_name, name, **kwargs)
|
---|
8 |
|
---|
9 | + def formfield(self, **kwargs):
|
---|
10 | + defaults = {'form_class': curry(forms.XMLField, schema_path=self.schema_path)}
|
---|
11 | + defaults.update(kwargs)
|
---|
12 | + return super(XMLField, self).formfield(**defaults)
|
---|
13 | +
|
---|
14 | def get_manipulator_field_objs(self):
|
---|
15 | return [curry(oldforms.XMLLargeTextField, schema_path=self.schema_path)]
|
---|
16 |
|
---|
17 | Index: django/newforms/fields.py
|
---|
18 | ===================================================================
|
---|
19 | --- django/newforms/fields.py (revision 7538)
|
---|
20 | +++ django/newforms/fields.py (working copy)
|
---|
21 | @@ -32,7 +32,7 @@
|
---|
22 | 'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField',
|
---|
23 | 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField',
|
---|
24 | 'ComboField', 'MultiValueField', 'FloatField', 'DecimalField',
|
---|
25 | - 'SplitDateTimeField', 'IPAddressField', 'FilePathField',
|
---|
26 | + 'SplitDateTimeField', 'IPAddressField', 'FilePathField', 'XMLField'
|
---|
27 | )
|
---|
28 |
|
---|
29 | # These values, if given to to_python(), will trigger the self.required check.
|
---|
30 | @@ -782,3 +782,19 @@
|
---|
31 |
|
---|
32 | def __init__(self, *args, **kwargs):
|
---|
33 | super(IPAddressField, self).__init__(ipv4_re, *args, **kwargs)
|
---|
34 | +
|
---|
35 | +class XMLField(CharField):
|
---|
36 | + """
|
---|
37 | + A field that validates XML content against a RelaxNG schema
|
---|
38 | + """
|
---|
39 | + def __init__(self, schema_path=None, *args, **kwargs):
|
---|
40 | + super(XMLField, self).__init__(*args, **kwargs)
|
---|
41 | + self.schema_path = schema_path
|
---|
42 | +
|
---|
43 | + def clean(self, value):
|
---|
44 | + from django.core.validators import RelaxNGCompact, ValidationError as OldValidationError
|
---|
45 | + if self.schema_path:
|
---|
46 | + try:
|
---|
47 | + RelaxNGCompact(self.schema_path)(value, "")
|
---|
48 | + except OldValidationError, e:
|
---|
49 | + raise ValidationError(e.messages)
|
---|