Fixed #3094 -- Accelerated deprecation of XMLField, since it hasn't served any useful purpose since oldforms. Thanks to PaulM for driving the issue and providing the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15723 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2011-03-03 13:28:20 +00:00
parent b921f1bac0
commit d1290b5b43
8 changed files with 44 additions and 25 deletions

View File

@ -54,6 +54,8 @@ class LayerMapping(object):
models.TextField : OFTString, models.TextField : OFTString,
models.URLField : OFTString, models.URLField : OFTString,
USStateField : OFTString, USStateField : OFTString,
# This is a reminder that XMLField is deprecated
# and this needs to be removed in 1.4
models.XMLField : OFTString, models.XMLField : OFTString,
models.SmallIntegerField : (OFTInteger, OFTReal, OFTString), models.SmallIntegerField : (OFTInteger, OFTReal, OFTString),
models.PositiveSmallIntegerField : (OFTInteger, OFTReal, OFTString), models.PositiveSmallIntegerField : (OFTInteger, OFTReal, OFTString),

View File

@ -206,8 +206,8 @@ class Field(object):
# #
# A Field class can implement the get_internal_type() method to specify # A Field class can implement the get_internal_type() method to specify
# which *preexisting* Django Field class it's most similar to -- i.e., # which *preexisting* Django Field class it's most similar to -- i.e.,
# an XMLField is represented by a TEXT column type, which is the same # a custom field might be represented by a TEXT column type, which is the
# as the TextField Django field type, which means XMLField's # same as the TextField Django field type, which means the custom field's
# get_internal_type() returns 'TextField'. # get_internal_type() returns 'TextField'.
# #
# But the limitation of the get_internal_type() / data_types approach # But the limitation of the get_internal_type() / data_types approach
@ -1136,6 +1136,9 @@ class XMLField(TextField):
description = _("XML text") description = _("XML text")
def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs): def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
import warnings
warnings.warn("Use of XMLField has been deprecated; please use TextField instead.",
DeprecationWarning)
self.schema_path = schema_path self.schema_path = schema_path
Field.__init__(self, verbose_name, name, **kwargs) Field.__init__(self, verbose_name, name, **kwargs)

View File

@ -41,9 +41,10 @@ their deprecation, as per the :ref:`Django deprecation policy
removed. removed.
* The ``get_db_prep_save``, ``get_db_prep_value`` and * The ``get_db_prep_save``, ``get_db_prep_value`` and
``get_db_prep_lookup`` methods on Field were modified in 1.2 to support ``get_db_prep_lookup`` methods on Field were modified in 1.2
multiple databases. In 1.4, the support functions that allow methods to support multiple databases. In 1.4, the support functions
with the old prototype to continue working will be removed. that allow methods with the old prototype to continue
working will be removed.
* The ``Message`` model (in ``django.contrib.auth``), its related * The ``Message`` model (in ``django.contrib.auth``), its related
manager in the ``User`` model (``user.message_set``), and the manager in the ``User`` model (``user.message_set``), and the
@ -105,6 +106,12 @@ their deprecation, as per the :ref:`Django deprecation policy
with a trailing slash to ensure there is a consistent way to with a trailing slash to ensure there is a consistent way to
combine paths in templates. combine paths in templates.
* ``django.db.models.fields.XMLField`` will be removed. This was
deprecated as part of the 1.3 release. An accelerated deprecation
schedule has been used because the field hasn't performed any role
beyond that of a simple ``TextField`` since the removal of oldforms.
All uses of ``XMLField`` can be replaced with ``TextField``.
* 1.5 * 1.5
* The ``mod_python`` request handler has been deprecated since the 1.3 * The ``mod_python`` request handler has been deprecated since the 1.3
release. The ``mod_wsgi`` handler should be used instead. release. The ``mod_wsgi`` handler should be used instead.

View File

@ -12,7 +12,7 @@ This document contains all the gory details about all the `field options`_ and
.. seealso:: .. seealso::
If the built-in fields don't do the trick, you can try If the built-in fields don't do the trick, you can try
:mod:`django.contrib.localflavor`, which contains assorted pieces of code :mod:`django.contrib.localflavor`, which contains assorted pieces of code
that are useful for particular countries or cultures. Also, you can easily that are useful for particular countries or cultures. Also, you can easily
:doc:`write your own custom model fields </howto/custom-model-fields>`. :doc:`write your own custom model fields </howto/custom-model-fields>`.
@ -462,7 +462,7 @@ The admin represents this as an ``<input type="text">`` (a single-line input).
For more information about the differences between the For more information about the differences between the
:class:`FloatField` and :class:`DecimalField` classes, please :class:`FloatField` and :class:`DecimalField` classes, please
see :ref:`FloatField vs. DecimalField <floatfield_vs_decimalfield>`. see :ref:`FloatField vs. DecimalField <floatfield_vs_decimalfield>`.
``EmailField`` ``EmailField``
-------------- --------------
@ -557,7 +557,7 @@ day. If you upload a file on Jan. 15, 2007, it will be saved in the directory
If you wanted to retrieve the uploaded file's on-disk filename, or the file's If you wanted to retrieve the uploaded file's on-disk filename, or the file's
size, you could use the :attr:`~django.core.files.File.name` and size, you could use the :attr:`~django.core.files.File.name` and
:attr:`~django.core.files.File.size` attributes respectively; for more :attr:`~django.core.files.File.size` attributes respectively; for more
information on the available attributes and methods, see the information on the available attributes and methods, see the
:class:`~django.core.files.File` class reference and the :doc:`/topics/files` :class:`~django.core.files.File` class reference and the :doc:`/topics/files`
topic guide. topic guide.
@ -836,17 +836,18 @@ Like all :class:`CharField` subclasses, :class:`URLField` takes the optional
``XMLField`` ``XMLField``
------------ ------------
.. deprecated:: 1.3
``XMLField`` is deprecated. Use TextField instead.
.. class:: XMLField(schema_path=None, [**options]) .. class:: XMLField(schema_path=None, [**options])
A :class:`TextField` that checks that the value is valid XML that matches a A :class:`TextField` that stores XML data and a path to a schema. Takes one
given schema. Takes one required argument: optional argument:
.. attribute:: schema_path .. attribute:: schema_path
The filesystem path to a RelaxNG_ schema against which to validate the The filesystem path to a schema for the field.
field.
.. _RelaxNG: http://www.relaxng.org/
Relationship fields Relationship fields
=================== ===================

View File

@ -843,3 +843,21 @@ migration. In Django 1.3, the ``PermWrapper`` class has also been
moved to ``django.contrib.auth.context_processors``, along with the moved to ``django.contrib.auth.context_processors``, along with the
``PermLookupDict`` support class. The new classes are functionally ``PermLookupDict`` support class. The new classes are functionally
identical to their old versions; only the module location has changed. identical to their old versions; only the module location has changed.
Removal of ``XMLField``
~~~~~~~~~~~~~~~~~~~~~~~
When Django was first released, Django included an ``XMLField`` that
performed automatic XML validation for any field input. However, this
validation function hasn't been performed since the introduction of
``newforms``, prior to the 1.0 release. As a result, ``XMLField`` as
currently implemented is functionally indistinguishable from a simple
``TextField``.
For this reason, Django 1.3 has fast-tracked the deprecation of
``XMLField`` -- instead of a two-release deprecation, ``XMLField``
will be removed entirely in Django 1.4.
It's easy to update your code to accommodate this change -- just
replace all uses of ``XMLField`` with ``TextField``, and remove the
``schema_path`` keyword argument (if it is specified).

View File

@ -106,9 +106,6 @@ the full list of conversions:
``URLField`` ``URLField`` with ``verify_exists`` set ``URLField`` ``URLField`` with ``verify_exists`` set
to the model field's ``verify_exists`` to the model field's ``verify_exists``
``XMLField`` ``CharField`` with
``widget=forms.Textarea``
=============================== ======================================== =============================== ========================================
.. versionadded:: 1.2 .. versionadded:: 1.2

View File

@ -79,9 +79,6 @@ class TimeData(models.Model):
class USStateData(models.Model): class USStateData(models.Model):
data = USStateField(null=True) data = USStateField(null=True)
class XMLData(models.Model):
data = models.XMLField(null=True)
class Tag(models.Model): class Tag(models.Model):
"""A tag on an item.""" """A tag on an item."""
data = models.SlugField() data = models.SlugField()
@ -218,9 +215,6 @@ class SmallPKData(models.Model):
class USStatePKData(models.Model): class USStatePKData(models.Model):
data = USStateField(primary_key=True) data = USStateField(primary_key=True)
# class XMLPKData(models.Model):
# data = models.XMLField(primary_key=True)
class ComplexModel(models.Model): class ComplexModel(models.Model):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)

View File

@ -222,9 +222,6 @@ The end."""),
(data_obj, 180, USStateData, "MA"), (data_obj, 180, USStateData, "MA"),
(data_obj, 181, USStateData, None), (data_obj, 181, USStateData, None),
(data_obj, 182, USStateData, ""), (data_obj, 182, USStateData, ""),
(data_obj, 190, XMLData, "<foo></foo>"),
(data_obj, 191, XMLData, None),
(data_obj, 192, XMLData, ""),
(generic_obj, 200, GenericData, ['Generic Object 1', 'tag1', 'tag2']), (generic_obj, 200, GenericData, ['Generic Object 1', 'tag1', 'tag2']),
(generic_obj, 201, GenericData, ['Generic Object 2', 'tag2', 'tag3']), (generic_obj, 201, GenericData, ['Generic Object 2', 'tag2', 'tag3']),