djangotypeerror

TypeError at /admin/location __str__ returned non-string (type NoneType)


I have a piece of code and each time I want to render the frontend template, it gives just 'None' at every segment such as name, phone etc. When I want to see it from admin page, it throws an error:

TypeError at /admin/accounts/student/2/change/

str__ returned non-string (type NoneType)

I'm completely new to Django. If anyone could help me, I'll be very grateful. Thanks in advance.

Here is my models.py:

from django.contrib.auth.models import User

# Create your models here.

class Student(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    phone = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200, null=True)
    profile_pic = models.ImageField(null= True, blank= True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)

    def __str__(self):
        return self.name

class Tag(models.Model):
    name = models.CharField(max_length=200, null=True)
    def __str__(self):
        return self.name

class Books(models.Model):
    CATEGORY = (
            ('Physics', 'Physics'),
            ('Chemistry', 'Chemistry'),
            ('Mathematics', 'Mathematics'),
            ) 

    name = models.CharField(max_length=200, null=True)
    author = models.CharField(max_length=200, null=True)
    price = models.FloatField(null=True)
    category = models.CharField(max_length=200, null=True, choices=CATEGORY)
    description = models.CharField(max_length=200, null=True, blank=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    tags = models.ManyToManyField(Tag)

    def __str__(self):
        return self.name

class Issue(models.Model):
    STATUS = (
            ('Pending', 'Pending'),
            ('Out for delivery', 'Out for delivery'),
            ('Delivered', 'Delivered'),
            )

    student = models.ForeignKey(Student, null=True, on_delete= models.SET_NULL)
    book = models.ForeignKey(Books, null=True, on_delete= models.SET_NULL)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    status = models.CharField(max_length=200, null=True, choices=STATUS)

    def __str__(self):
        return self.book.name

Here is my admin.py file:

from . models import *
# Register your models here.


admin.site.register(Student)
admin.site.register(Books)
admin.site.register(Tag )
admin.site.register(Issue)

Error during template rendering:


__str__ returned non-string (type NoneType)
1   {% load i18n static %}<!DOCTYPE html>
2   {% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}
3   <html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
4   <head>
5   <title>{% block title %}{% endblock %}</title>
6   <link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}">
7   {% if not is_popup and is_nav_sidebar_enabled %}
8     <link rel="stylesheet" type="text/css" href="{% static "admin/css/nav_sidebar.css" %}">
9     <script src="{% static 'admin/js/nav_sidebar.js' %}" defer></script>
10  {% endif %}

Solution

  • Finally I solved the problem. In Student model, I just replaced it:

            return str(self.name)
    

    instead return self.name