Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed #20224 -- Update docs examples which mention __unicode__ #1330

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion django/contrib/gis/management/commands/ogrinspect.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class Command(LabelCommand):
make_option('--multi-geom', action='store_true', dest='multi_geom', default=False, make_option('--multi-geom', action='store_true', dest='multi_geom', default=False,
help='Treat the geometry in the data source as a geometry collection.'), help='Treat the geometry in the data source as a geometry collection.'),
make_option('--name-field', dest='name_field', make_option('--name-field', dest='name_field',
help='Specifies a field name to return for the `__unicode__` function.'), help='Specifies a field name to return for the `__unicode__`/`__str__` function.'),
make_option('--no-imports', action='store_false', dest='imports', default=True, make_option('--no-imports', action='store_false', dest='imports', default=True,
help='Do not include `from django.contrib.gis.db import models` ' help='Do not include `from django.contrib.gis.db import models` '
'statement.'), 'statement.'),
Expand Down
5 changes: 3 additions & 2 deletions django/contrib/gis/utils/ogrinspect.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def ogrinspect(*args, **kwargs):
`multi_geom` => Boolean (default: False) - specify as multigeometry. `multi_geom` => Boolean (default: False) - specify as multigeometry.


`name_field` => String - specifies a field name to return for the `name_field` => String - specifies a field name to return for the
`__unicode__` function (which will be generated if specified). `__unicode__`/`__str__` function (which will be generated if specified).


`imports` => Boolean (default: True) - set to False to omit the `imports` => Boolean (default: True) - set to False to omit the
`from django.contrib.gis.db import models` code from the `from django.contrib.gis.db import models` code from the
Expand Down Expand Up @@ -221,4 +221,5 @@ def get_kwargs_str(field_name):


if name_field: if name_field:
yield '' yield ''
yield ' def __str__(self): return self.%s' % name_field yield ' def __%s__(self): return self.%s' % (
'str' if six.PY3 else 'unicode', name_field)
6 changes: 3 additions & 3 deletions docs/howto/custom-model-fields.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -696,9 +696,9 @@ smoothly:
behavior of the field code is to call behavior of the field code is to call
:func:`~django.utils.encoding.force_text` on the value. (In our :func:`~django.utils.encoding.force_text` on the value. (In our
examples in this document, ``value`` would be a ``Hand`` instance, not a examples in this document, ``value`` would be a ``Hand`` instance, not a
``HandField``). So if your ``__unicode__()`` method automatically ``HandField``). So if your ``__unicode__()`` method (``__str__`` on Python 3)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add () on str for consistency with "unicode()"

converts to the string form of your Python object, you can save yourself automatically converts to the string form of your Python object, you can save
a lot of work. yourself a lot of work.




Writing a ``FileField`` subclass Writing a ``FileField`` subclass
Expand Down
5 changes: 4 additions & 1 deletion docs/internals/contributing/writing-code/coding-style.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -124,13 +124,16 @@ Model style
first_name = models.CharField(max_length=20) first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=40) last_name = models.CharField(max_length=40)


* If you define a ``__str__`` method (previously ``__unicode__`` before Python 3
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment and the one above are worded differently. It would be nice to have consistency.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Marc, I'm sorry but I'm not getting your idea here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Almost every place in the documentation we say "__unicode__ (or __str__ on Py3)". In this case we mention it the other way around. It's a minor point, and I guess actually as this is in the contributing docs it's a bit different. I hadn't noticed this was in contributing docs earlier which may be a bit different to user facing docs.

was supported), decorate the model class with
:func:`~django.utils.encoding.python_2_unicode_compatible`.

* The order of model inner classes and standard methods should be as * The order of model inner classes and standard methods should be as
follows (noting that these are not all required): follows (noting that these are not all required):


* All database fields * All database fields
* Custom manager attributes * Custom manager attributes
* ``class Meta`` * ``class Meta``
* ``def __unicode__()``
* ``def __str__()`` * ``def __str__()``
* ``def save()`` * ``def save()``
* ``def get_absolute_url()`` * ``def get_absolute_url()``
Expand Down
2 changes: 2 additions & 0 deletions docs/intro/overview.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ the file ``mysite/news/models.py``::
class Reporter(models.Model): class Reporter(models.Model):
full_name = models.CharField(max_length=70) full_name = models.CharField(max_length=70)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.full_name return self.full_name


Expand All @@ -40,6 +41,7 @@ the file ``mysite/news/models.py``::
content = models.TextField() content = models.TextField()
reporter = models.ForeignKey(Reporter) reporter = models.ForeignKey(Reporter)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.headline return self.headline


Expand Down
1 change: 1 addition & 0 deletions docs/ref/contrib/admin/actions.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ simple news application with an ``Article`` model::
body = models.TextField() body = models.TextField()
status = models.CharField(max_length=1, choices=STATUS_CHOICES) status = models.CharField(max_length=1, choices=STATUS_CHOICES)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.title return self.title


Expand Down
5 changes: 3 additions & 2 deletions docs/ref/contrib/admin/index.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -438,7 +438,8 @@ subclass::
list_display = ('first_name', 'last_name') list_display = ('first_name', 'last_name')


If you don't set ``list_display``, the admin site will display a single If you don't set ``list_display``, the admin site will display a single
column that displays the ``__unicode__()`` representation of each object. column that displays the ``__unicode__()`` (``__str__()`` on Python 3)
representation of each object.


You have four possible values that can be used in ``list_display``: You have four possible values that can be used in ``list_display``:


Expand Down Expand Up @@ -488,7 +489,7 @@ subclass::
A few special cases to note about ``list_display``: A few special cases to note about ``list_display``:


* If the field is a ``ForeignKey``, Django will display the * If the field is a ``ForeignKey``, Django will display the
``__unicode__()`` of the related object. ``__unicode__()`` (``__str__()`` on Python 3) of the related object.


* ``ManyToManyField`` fields aren't supported, because that would * ``ManyToManyField`` fields aren't supported, because that would
entail executing a separate SQL statement for each row in the table. entail executing a separate SQL statement for each row in the table.
Expand Down
1 change: 1 addition & 0 deletions docs/ref/contrib/contenttypes.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ A simple example is a tagging system, which might look like this::
object_id = models.PositiveIntegerField() object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id') content_object = generic.GenericForeignKey('content_type', 'object_id')


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.tag return self.tag


Expand Down
4 changes: 2 additions & 2 deletions docs/ref/contrib/gis/commands.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ of using ``ogrinspect`` :ref:`in the tutorial <ogrinspect-intro>`.


.. django-admin-option:: --name-field <name_field> .. django-admin-option:: --name-field <name_field>


Generates a ``__unicode__`` routine on the model that will return the Generates a ``__unicode__`` routine (``__str__`` on Python 3) on the model
the given field name. that will return the the given field name.


.. django-admin-option:: --no-imports .. django-admin-option:: --no-imports


Expand Down
2 changes: 2 additions & 0 deletions docs/ref/contrib/gis/layermapping.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ Example
name = models.CharField(max_length=25) # corresponds to the 'str' field name = models.CharField(max_length=25) # corresponds to the 'str' field
poly = models.PolygonField(srid=4269) # we want our model in a different SRID poly = models.PolygonField(srid=4269) # we want our model in a different SRID
objects = models.GeoManager() objects = models.GeoManager()

# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return 'Name: %s' % self.name return 'Name: %s' % self.name


Expand Down
1 change: 1 addition & 0 deletions docs/ref/contrib/gis/tutorial.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ model to represent this data::
objects = models.GeoManager() objects = models.GeoManager()


# Returns the string representation of the model. # Returns the string representation of the model.
# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


Expand Down
3 changes: 2 additions & 1 deletion docs/ref/forms/api.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -566,7 +566,8 @@ Customizing the error list format


By default, forms use ``django.forms.util.ErrorList`` to format validation By default, forms use ``django.forms.util.ErrorList`` to format validation
errors. If you'd like to use an alternate class for displaying errors, you can errors. If you'd like to use an alternate class for displaying errors, you can
pass that in at construction time:: pass that in at construction time (replace ``__unicode__`` by ``__str__`` on
Python 3)::


>>> from django.forms.util import ErrorList >>> from django.forms.util import ErrorList
>>> class DivErrorList(ErrorList): >>> class DivErrorList(ErrorList):
Expand Down
12 changes: 6 additions & 6 deletions docs/ref/forms/fields.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1000,12 +1000,12 @@ objects (in the case of ``ModelMultipleChoiceField``) into the
initial value, no empty choice is created (regardless of the value initial value, no empty choice is created (regardless of the value
of ``empty_label``). of ``empty_label``).


The ``__unicode__`` method of the model will be called to generate The ``__unicode__`` (``__str__`` on Python 3) method of the model will be
string representations of the objects for use in the field's choices; called to generate string representations of the objects for use in the
to provide customized representations, subclass ``ModelChoiceField`` field's choices; to provide customized representations, subclass
and override ``label_from_instance``. This method will receive a model ``ModelChoiceField`` and override ``label_from_instance``. This method will
object, and should return a string suitable for representing it. For receive a model object, and should return a string suitable for representing
example:: it. For example::


from django.forms import ModelChoiceField from django.forms import ModelChoiceField


Expand Down
6 changes: 6 additions & 0 deletions docs/ref/models/instances.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -430,6 +430,12 @@ Other model instance methods


A few object methods have special purposes. A few object methods have special purposes.


.. note::
On Python 3, as all strings are natively considered Unicode, only use the
``__str__()`` method, which entirely obsoletes the ``__unicode__()`` method.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd replace

", which entirely obsoletes the ``__unicode__()`` method"

with

"(the __unicode__()`` method is obsolete)"

If you'd like compatibility with Python 2, you can decorate your model class
with :func:`~django.utils.encoding.python_2_unicode_compatible`.

``__unicode__`` ``__unicode__``
--------------- ---------------


Expand Down
1 change: 1 addition & 0 deletions docs/ref/models/querysets.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -817,6 +817,7 @@ For example, suppose you have these models::
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
toppings = models.ManyToManyField(Topping) toppings = models.ManyToManyField(Topping)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return u"%s (%s)" % (self.name, u", ".join([topping.name return u"%s (%s)" % (self.name, u", ".join([topping.name
for topping in self.toppings.all()])) for topping in self.toppings.all()]))
Expand Down
6 changes: 4 additions & 2 deletions docs/ref/utils.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -446,12 +446,14 @@ Atom1Feed
def fancy_utility_function(s, ...): def fancy_utility_function(s, ...):
# Do some conversion on string 's' # Do some conversion on string 's'
... ...
# Replace unicode by str on Python 3
fancy_utility_function = allow_lazy(fancy_utility_function, unicode) fancy_utility_function = allow_lazy(fancy_utility_function, unicode)


The ``allow_lazy()`` decorator takes, in addition to the function to decorate, The ``allow_lazy()`` decorator takes, in addition to the function to decorate,
a number of extra arguments (``*args``) specifying the type(s) that the a number of extra arguments (``*args``) specifying the type(s) that the
original function can return. Usually, it's enough to include ``unicode`` here original function can return. Usually, it's enough to include ``unicode``
and ensure that your function returns only Unicode strings. (or ``str`` on Python 3) here and ensure that your function returns only
Unicode strings.


Using this decorator means you can write your function and assume that the Using this decorator means you can write your function and assume that the
input is a proper string, then add support for lazy translation objects at the input is a proper string, then add support for lazy translation objects at the
Expand Down
1 change: 1 addition & 0 deletions docs/topics/auth/customizing.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -967,6 +967,7 @@ authentication app::
# The user is identified by their email address # The user is identified by their email address
return self.email return self.email


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.email return self.email


Expand Down
2 changes: 2 additions & 0 deletions docs/topics/class-based-views/generic-display.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ We'll be using these models::
class Meta: class Meta:
ordering = ["-name"] ordering = ["-name"]


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


Expand All @@ -98,6 +99,7 @@ We'll be using these models::
email = models.EmailField() email = models.EmailField()
headshot = models.ImageField(upload_to='author_headshots') headshot = models.ImageField(upload_to='author_headshots')


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


Expand Down
2 changes: 2 additions & 0 deletions docs/topics/db/examples/many_to_many.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ objects, and a ``Publication`` has multiple ``Article`` objects:
class Publication(models.Model): class Publication(models.Model):
title = models.CharField(max_length=30) title = models.CharField(max_length=30)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.title return self.title


Expand All @@ -26,6 +27,7 @@ objects, and a ``Publication`` has multiple ``Article`` objects:
headline = models.CharField(max_length=100) headline = models.CharField(max_length=100)
publications = models.ManyToManyField(Publication) publications = models.ManyToManyField(Publication)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.headline return self.headline


Expand Down
8 changes: 5 additions & 3 deletions docs/topics/db/examples/many_to_one.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ To define a many-to-one relationship, use :class:`~django.db.models.ForeignKey`.
last_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
email = models.EmailField() email = models.EmailField()


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return u"%s %s" % (self.first_name, self.last_name) return u"%s %s" % (self.first_name, self.last_name)


Expand All @@ -23,6 +24,7 @@ To define a many-to-one relationship, use :class:`~django.db.models.ForeignKey`.
pub_date = models.DateField() pub_date = models.DateField()
reporter = models.ForeignKey(Reporter) reporter = models.ForeignKey(Reporter)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.headline return self.headline


Expand Down Expand Up @@ -56,9 +58,9 @@ Article objects have access to their related Reporter objects::


>>> r = a.reporter >>> r = a.reporter


These are strings instead of unicode strings because that's what was used in On Python 2, these are strings instead of unicode strings because that's what
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe add: strings of type str

the creation of this reporter (and we haven't refreshed the data from the was used in the creation of this reporter (and we haven't refreshed the data
database, which always returns unicode strings):: from the database, which always returns unicode strings)::


>>> r.first_name, r.last_name >>> r.first_name, r.last_name
('John', 'Smith') ('John', 'Smith')
Expand Down
3 changes: 3 additions & 0 deletions docs/topics/db/examples/one_to_one.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ In this example, a ``Place`` optionally can be a ``Restaurant``:
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
address = models.CharField(max_length=80) address = models.CharField(max_length=80)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return u"%s the place" % self.name return u"%s the place" % self.name


Expand All @@ -24,13 +25,15 @@ In this example, a ``Place`` optionally can be a ``Restaurant``:
serves_hot_dogs = models.BooleanField() serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField() serves_pizza = models.BooleanField()


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return u"%s the restaurant" % self.place.name return u"%s the restaurant" % self.place.name


class Waiter(models.Model): class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant) restaurant = models.ForeignKey(Restaurant)
name = models.CharField(max_length=50) name = models.CharField(max_length=50)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return u"%s the waiter at %s" % (self.name, self.restaurant) return u"%s the waiter at %s" % (self.name, self.restaurant)


Expand Down
7 changes: 6 additions & 1 deletion docs/topics/db/models.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -416,13 +416,15 @@ something like this::
class Person(models.Model): class Person(models.Model):
name = models.CharField(max_length=128) name = models.CharField(max_length=128)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


class Group(models.Model): class Group(models.Model):
name = models.CharField(max_length=128) name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership') members = models.ManyToManyField(Person, through='Membership')


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


Expand Down Expand Up @@ -709,7 +711,10 @@ of :ref:`methods automatically given to each model <model-instance-methods>`.
You can override most of these -- see `overriding predefined model methods`_, You can override most of these -- see `overriding predefined model methods`_,
below -- but there are a couple that you'll almost always want to define: below -- but there are a couple that you'll almost always want to define:


:meth:`~Model.__unicode__` :meth:`~Model.__str__` (Python 3)
Python 3 equivalent of ``__unicode__()``.

:meth:`~Model.__unicode__` (Python 2)
A Python "magic method" that returns a unicode "representation" of any A Python "magic method" that returns a unicode "representation" of any
object. This is what Python and Django will use whenever a model object. This is what Python and Django will use whenever a model
instance needs to be coerced and displayed as a plain string. Most instance needs to be coerced and displayed as a plain string. Most
Expand Down
3 changes: 3 additions & 0 deletions docs/topics/db/queries.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ models, which comprise a Weblog application:
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
tagline = models.TextField() tagline = models.TextField()


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


class Author(models.Model): class Author(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
email = models.EmailField() email = models.EmailField()


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


Expand All @@ -44,6 +46,7 @@ models, which comprise a Weblog application:
n_pingbacks = models.IntegerField() n_pingbacks = models.IntegerField()
rating = models.IntegerField() rating = models.IntegerField()


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.headline return self.headline


Expand Down
1 change: 1 addition & 0 deletions docs/topics/forms/modelforms.txt
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ Consider this set of models::
title = models.CharField(max_length=3, choices=TITLE_CHOICES) title = models.CharField(max_length=3, choices=TITLE_CHOICES)
birth_date = models.DateField(blank=True, null=True) birth_date = models.DateField(blank=True, null=True)


# On Python 3: def __str__(self):
def __unicode__(self): def __unicode__(self):
return self.name return self.name


Expand Down