[Solved] Error in admin: __str__ returned non-string (type NoneType)

The admin returns this error when trying to add an instance to one of my models. The model itself has a correct str() method and contains no instances yet. Also tried replacing the str() method with a static method or removing it altogether. No luck.

The error seems to point towards something going wrong in the history part of the admin. Stacktrace points to line 33.

Error during template rendering

In template /Users/snirp/juis/snirpdrive/glotto/venv/lib/python3.6/site-packages/django/contrib/admin/templates/admin/change_form.html, error at line 33
__str__ returned non-string (type NoneType)
23  {% endblock %}
24  {% endif %}
25  
26  {% block content %}<div id="content-main">
27  {% block object-tools %}
28  {% if change %}{% if not is_popup %}
29    <ul class="object-tools">
30      {% block object-tools-items %}
31      <li>
32          {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
33          <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>
34      </li>
35      {% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %}
36      {% endblock %}
37    </ul>
38  {% endif %}{% endif %}
39  {% endblock %}
40  <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %}
41  <div>
42  {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %}
43  {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %}

These are the relevant parts of my models.py and admin.py

class UserContent(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(User, related_name='%(class)s_creator')
    updated_by = models.ForeignKey(User, related_name='%(class)s_updater')

    class Meta:
        abstract = True


class Linetrans(UserContent):
    line = models.ForeignKey(Line)
    translation = models.ForeignKey(Translation)
    text = models.CharField(max_length=400)

    #def __str__(self):
    #    return self.text

    class Meta:
        ordering = ['line']

and

admin.site.register(Linetrans)

Other model classes are very similar and do not return an error. The error also occurs when the Linetrans is added as an inline to another admin class.

edit / update: I commented out all other str() methods in my model and sure enough the error seems to go away. Now trying to pinpoint the issue.

Solution #1:

Turns out that there was an unexpected empty CharField in a related model. Leaving this an an answer, because it might help others.

Troubleshoot the issue by systematically commenting out the __str__() methods of your models until you find the offending model. Work from there to identify the offending record(s).

Respondent: Roy Prins

Solution #2:

I had a similar issue. The problem was that the primary key for one row was null ( I dont know how that happened). I couldnt delete the row because of cascade issues. so I had to change the str mmethod to somthing like this.

def __str__(self):
    if self.customerName==None:
        return "ERROR-CUSTOMER NAME IS NULL"
    return self.customerName
Respondent: Roy Prins

Solution #3:

Check out the class that you have referred to in

        models.ForeignKey 

The problem lies in the

        __str__() 

method of one of those classes.
Then, add

                             or ''

in the return statement of that class like this.

        def __str__(self):
            return self.title or ''

Solution #4:

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

Use str to make it type string.
Then it’s not not-string type.

Respondent: Dimanjan

Solution #5:

For this error you can use two solutions

first solution: you can comment it out below code

 def __str__(self):
    return self.id

to

 #def __str__(self):
 #  return self.id

secound solution: you can return the string from the object

 def __str__(self):
    return str(self.id)
Respondent: 1UC1F3R616

Solution #6:

You can also delete the instances in the model causing this problem from the django shell python manage.py shell . This helps when you are dealing with a model with lots of related models like mine.

Typically this problem is caused by altering model fields and
migrating, such that the instances are incompatible with each other
and related fields

Respondent: sanjay

Solution #7:

In my case I had the same issue and its origin was that: for the field used in the __str__ functions, has null values saved in the data base.

So I can solve the issue doing somethings like this:

update table
set field_for_STR_use = 'any value'
where field_for_STR_use is null or field_for_STR_use = ''

after that, I only refreshed my view and the problem had disappeared.

Respondent: スラッシュ

Solution #8:

There was one of the foreign reference which was returning non string field. I changed it to string field or you can change to str(foreign-key-return-element)
name = models.CharField(max_length=200, unique=True) # name of the article
parent = models.ForeignKey(‘self’,on_delete=models.DO_NOTHING,related_name=”category_parent_item”, default=None, null=True) # Store child items
created_at = models.DateTimeField(auto_now=True) # Creation date
updated_at = models.DateTimeField(auto_now=True) # Updation Date
user = models.ForeignKey(get_user_model(),

on_delete=models.DO_NOTHING,related_name=”category_update_user”, default=None, null=True) #User who updated the Article

def __str__(self):
    return self.name ----------> this was an integer field initially in foreign reference
Respondent: hmatus

Solution #9:

In my case, I had a different model that was called by another one that had the default snippet from VSCode as:

def __str__(self):
    return

This was causing the error, even when it was showing in the log another place.

Respondent: chandrani

Solution #10:

If you are trying to use __str__() to return the value of a ForeignKey or a OneToOneField this would return error

Example:

def __str__():
    return self.user  # where user is a key to other model class

It should be:

def __str__():
    return self.user.__str__() 
    # Or basically any other way that would explicitly unbox the value inside the related model class.
Respondent: tonhozi

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published. Required fields are marked *

New ride at Perth's Adventure World a ‘swing on steroids’ - Australasian Leisure Management npp pharma the truth about anabolic steroid drugs and professional sports