cikatomo
cikatomo

Reputation: 1632

__str__ returned non-string (type datetime.date)

In Django I have 2 models:

in inventory/models.py:

class Transaction(models.Model):
    date = models.DateField()
    product = models.ForeignKey(
        Product, on_delete=models.PROTECT)
    type = models.ForeignKey(TransactionType, on_delete=models.PROTECT)
    quantity = models.IntegerField()
    location = models.ForeignKey(Location, on_delete=models.PROTECT)
    note = models.TextField(null=True, blank=True)

    def __str__(self) -> str:
        return f'{self.date}, {self.product.name}, {self.type.name}'

And it's working normal.

On the other hand. This model in sales/models.py:

class Sale(models.Model):
    date = models.DateField()
    sale_id = models.IntegerField()
    sku = models.CharField(max_length=10)
    product = models.CharField(max_length=100)
    quantity = models.IntegerField()
    price = models.FloatField()
    channel = models.CharField(max_length=100)
    nooks_payout_schedule = models.ForeignKey(
        NooksPayoutSchedule, on_delete=models.RESTRICT, blank=True, null=True)

    def __str__(self) -> str:
        return f'{self.date}, {self.product}'

give me error: __str__ returned non-string (type datetime.date)

when trying to see details of a Sale record in admin dashboard. Inventory record I can see no problem.

What Ive tried Ive tried to use str(self.date), but it's same error.

I can't see the difference between those 2 models yet they are working differently. Do you know why?

Full trace:

Environment:


Request Method: GET
Request URL: http://localhost:8000/admin/sales/sale/160/change/

Django Version: 3.1.2
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'sales',
 'inventory',
 'graphene_django',
 'corsheaders',
 'django_pivot',
 'drf_spectacular',
 'django_extensions']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'corsheaders.middleware.CorsMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template /home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
   __str__ returned non-string (type datetime.date)
   9 :             {% for field in line %}
   10 :                 <div{% if not line.fields|length_is:'1' %} class="fieldBox{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
   11 :                     {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
   12 :                     {% if field.is_checkbox %}
   13 :                         {{ field.field }}{{ field.label_tag }}
   14 :                     {% else %}
   15 :                         {{ field.label_tag }}
   16 :                         {% if field.is_readonly %}
   17 :                             <div class="readonly">{{ field.contents }}</div>
   18 :                         {% else %}
   19 :                              {{ field.field }} 
   20 :                         {% endif %}
   21 :                     {% endif %}
   22 :                     {% if field.field.help_text %}
   23 :                         <div class="help">{{ field.field.help_text|safe }}</div>
   24 :                     {% endif %}
   25 :                 </div>
   26 :             {% endfor %}
   27 :         </div>
   28 :     {% endfor %}
   29 : </fieldset>


Traceback (most recent call last):
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/core/handlers/base.py", line 202, in _get_response
    response = response.render()
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 192, in render
    return template.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 172, in render
    return self._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 994, in render
    return render_value_in_context(output, context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 973, in render_value_in_context
    value = str(value)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/utils/html.py", line 376, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/boundfield.py", line 34, in __str__
    return self.as_widget()
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/boundfield.py", line 93, in as_widget
    return widget.render(
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 241, in render
    context = self.get_context(name, value, attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/contrib/admin/widgets.py", line 283, in get_context
    'rendered_widget': self.widget.render(name, value, attrs),
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 241, in render
    context = self.get_context(name, value, attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 678, in get_context
    context = super().get_context(name, value, attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 639, in get_context
    context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 587, in optgroups
    for index, (option_value, option_label) in enumerate(self.choices):
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/models.py", line 1157, in __iter__
    yield self.choice(obj)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/models.py", line 1171, in choice
    self.field.label_from_instance(obj),
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/models.py", line 1240, in label_from_instance
    return str(obj)

Exception Type: TypeError at /admin/sales/sale/160/change/
Exception Value: __str__ returned non-string (type datetime.date)

UPDATE:

the problem was Foreign Key of Sale class:


class NooksPayoutSchedule(models.Model):
    start_date = DateField()
    end_date = DateField()
    payout_date = DateField()
    is_picked = BooleanField()

    def __str__(self) -> str:
        return self.payout_date

Upvotes: 0

Views: 2022

Answers (1)

Seckinyilmaz
Seckinyilmaz

Reputation: 83

I have faced this problem and I've solved as following. And you are right problem comes from ForeignKey's model.

I have changed my str function as below (It is foreingkey's model str funtion):

def __str__(self):
        return str(self.someFieldName)

Upvotes: 3

Related Questions